diff --git a/About/Manifest.xml b/About/Manifest.xml
index 62c6b5d..c701bdb 100644
--- a/About/Manifest.xml
+++ b/About/Manifest.xml
@@ -1,7 +1,7 @@
RJW Sexperience
- 1.0.1.5
+ 1.0.1.6
@@ -9,4 +9,6 @@
+ https://raw.githubusercontent.com/moreoreganostodump/RJW-Sexperience/master/About/Manifest.xml
+ https://github.com/moreoreganostodump/RJW-Sexperience
\ No newline at end of file
diff --git a/Assemblies/RJWSexperience.dll b/Assemblies/RJWSexperience.dll
index 5a25201..2f609cb 100644
Binary files a/Assemblies/RJWSexperience.dll and b/Assemblies/RJWSexperience.dll differ
diff --git a/Defs/DutyDefs/Duties_Rituals_sex.xml b/Defs/DutyDefs/Duties_Rituals_sex.xml
new file mode 100644
index 0000000..3811d42
--- /dev/null
+++ b/Defs/DutyDefs/Duties_Rituals_sex.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ Gangbang
+ HighPriority
+ Off
+
+
+
+
+
+ 0.25
+
+
+
+
+
+
+
+
+ Jog
+ 50~250
+
+
+
+
+
+
+ FuckVictim
+ HighPriority
+ Off
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Defs/InteractionDefs/Interactions_Speech_sex.xml b/Defs/InteractionDefs/Interactions_Speech_sex.xml
new file mode 100644
index 0000000..4840a1b
--- /dev/null
+++ b/Defs/InteractionDefs/Interactions_Speech_sex.xml
@@ -0,0 +1,66 @@
+
+
+
+
+ Speech_Gangbang
+ gangbang speech
+ InteractionWorker
+ True
+ Things/Mote/SpeechSymbols/Speech
+
+ SpeechUtility
+
+ r_logentry->[INITIATOR_nameDef] [spokeof] [speechtopic].
+ r_logentry(p=0.2)->[INITIATOR_nameDef] [crazy].
+
+ speechtopic->the meaning and true value of rape
+ speechtopic->expressions of rape
+ speechtopic->controlled lustful
+ speechtopic->the warmth of pussy
+ speechtopic->the meaning of cum
+ speechtopic->love and rape
+ speechtopic->symbolizing rape
+ speechtopic->dick and pussy
+ speechtopic->the art of rape
+ speechtopic->the seduction of victim
+ speechtopic->the music of screams
+ speechtopic->cums on the floor
+
+ crazy->screamed maniacally
+ crazy->broke into a chant
+ crazy->chanted towards the heavens
+ crazy->spat in the sacrifice's genital
+ crazy->cackled
+ crazy->brandished a condom
+ crazy->muttered repetitively while masturbating
+
+
+
+
+
+ Speech_Zoophile
+ zoophile speech
+ InteractionWorker
+ True
+ Things/Mote/SpeechSymbols/Speech
+
+ SpeechUtility
+
+ r_logentry->[INITIATOR_nameDef] [spokeof] [speechtopic].
+
+ speechtopic->the meaning and true value of bestiality
+ speechtopic->expressions of bestiality
+ speechtopic->controlled lustful
+ speechtopic->the warmth of cum
+ speechtopic->the meaning of interspecies breeding
+ speechtopic->animal and love
+ speechtopic->symbolizing bestiality
+ speechtopic->breed and birth
+ speechtopic->the art of breeding
+ speechtopic->the seduction of animals
+ speechtopic->cums on the floor
+
+
+
+
+
\ No newline at end of file
diff --git a/Defs/JobDefs/Jobs_Ritual_Rape.xml b/Defs/JobDefs/Jobs_Ritual_Rape.xml
new file mode 100644
index 0000000..26f3e59
--- /dev/null
+++ b/Defs/JobDefs/Jobs_Ritual_Rape.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ RapeVictim
+ RJWSexperience.JobDriver_RapeVictim
+ rapin' victim
+ false
+
+
\ No newline at end of file
diff --git a/Defs/PawnRelationsDefs/PawnRelations_Family.xml b/Defs/PawnRelationsDefs/PawnRelations_Family.xml
deleted file mode 100644
index 1b6111d..0000000
--- a/Defs/PawnRelationsDefs/PawnRelations_Family.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
- PawnRelationWorker_Child
- Bastard
- bastard
- bastard
- 190
- MySonDied
- MyDaughterDied
- KilledMySon
- KilledMyDaughter
- MySonLost
- MyDaughterLost
-
- SoldMyLovedOne
-
- 30
- 1.0
- 0.03
- -30
- true
- true
-
-
\ No newline at end of file
diff --git a/Defs/PreceptDefs/Precepts_Bestiality.xml b/Defs/PreceptDefs/Precepts_Bestiality.xml
index 27de45d..50db142 100644
--- a/Defs/PreceptDefs/Precepts_Bestiality.xml
+++ b/Defs/PreceptDefs/Precepts_Bestiality.xml
@@ -40,17 +40,21 @@
SexWithVeneratedAnimal
Bestiality_Abhorrent
-
+
SexWithVeneratedAnimal
Bestiality_Know_Abhorrent
+ BeenRaped
+ true
SexWithAnimal
Bestiality_Abhorrent
-
+
SexWithAnimal
Bestiality_Know_Abhorrent
+ BeenRaped
+ true
@@ -75,17 +79,21 @@
SexWithVeneratedAnimal
Bestiality_Horrible
-
+
SexWithVeneratedAnimal
Bestiality_Know_Horrible
+ BeenRaped
+ true
SexWithAnimal
Bestiality_Horrible
-
+
SexWithAnimal
Bestiality_Know_Horrible
+ BeenRaped
+ true
@@ -110,17 +118,21 @@
SexWithVeneratedAnimal
Bestiality_Disapproved
-
+
SexWithVeneratedAnimal
Bestiality_Know_Disapproved
+ BeenRaped
+ true
SexWithAnimal
Bestiality_Disapproved
-
+
SexWithAnimal
Bestiality_Know_Disapproved
+ BeenRaped
+ true
@@ -203,6 +215,17 @@
Someone sex with animal
true
+
+ SexWithVeneratedAnimal
+ Bestiality_Honorable
+ true
+
+
+ SexWithVeneratedAnimal
+ Bestiality_Know_Honorable
+ Someone sex with animal
+ true
+
diff --git a/Defs/PreceptDefs/Precepts_Rape.xml b/Defs/PreceptDefs/Precepts_Rape.xml
index 6709eea..f651035 100644
--- a/Defs/PreceptDefs/Precepts_Rape.xml
+++ b/Defs/PreceptDefs/Precepts_Rape.xml
@@ -48,6 +48,9 @@
40
1000
30
+
+ RapeBad
+
Rapist
@@ -97,6 +100,9 @@
30
1000
30
+
+ RapeBad
+
Rapist
@@ -135,6 +141,9 @@
20
1000
20
+
+ RapeBad
+
Rapist
diff --git a/Defs/PreceptDefs/Precepts_Ritual_sex.xml b/Defs/PreceptDefs/Precepts_Ritual_sex.xml
new file mode 100644
index 0000000..87d0c7b
--- /dev/null
+++ b/Defs/PreceptDefs/Precepts_Ritual_sex.xml
@@ -0,0 +1,51 @@
+
+
+
+
+ GangbangCeremony
+ gangbang
+ A ritualistic gangbang where a initiator rape a victim. The audience will rape as the initiator.
+ Ritual
+ Medium
+ UI/Issues/Gangbang
+ Precept_Ritual
+ Gangbang
+ true
+ false
+ 1.0
+ 100
+ false
+ true
+ false
+ true
+
+ RapeBad
+
+
+ Rapist
+
+
+
+
+ AnimalGangbangCeremony
+ animal gangbang
+ A ritualistic gangbang where animals rape a victim.
+ Ritual
+ Medium
+ UI/Commands/Breeding_Pawn_off
+ Precept_Ritual
+ GangbangByAnimal
+ true
+ false
+ 1.0
+ 100
+ false
+ true
+ false
+ true
+
+ Zoophile
+
+
+
+
\ No newline at end of file
diff --git a/Defs/PreceptDefs/Precepts_Sex.xml b/Defs/PreceptDefs/Precepts_Sex.xml
index 22555b1..37242ba 100644
--- a/Defs/PreceptDefs/Precepts_Sex.xml
+++ b/Defs/PreceptDefs/Precepts_Sex.xml
@@ -55,33 +55,41 @@
1000
100
-
+
AnalSex
Sex_Promiscuous
+ Lust
+ 2.0
AnalSex
Sex_Know_Promiscuous
-
+
OralSex
Sex_Promiscuous
+ Lust
+ 2.0
OralSex
Sex_Know_Promiscuous
-
+
MiscSex
Sex_Promiscuous
+ Lust
+ 2.0
MiscSex
Sex_Know_Promiscuous
-
+
PromiscuousSex
Sex_Promiscuous
+ Lust
+ 3.0
PromiscuousSex
@@ -100,33 +108,41 @@
1000
10
-
+
VaginalSex
Sex_Promiscuous
+ Lust
+ 2.0
VaginalSex
Sex_Know_Promiscuous
-
+
OralSex
Sex_Promiscuous
+ Lust
+ 2.0
OralSex
Sex_Know_Promiscuous
-
+
MiscSex
Sex_Promiscuous
+ Lust
+ 2.0
MiscSex
Sex_Know_Promiscuous
-
+
PromiscuousSex
Sex_Promiscuous
+ Lust
+ 3.0
PromiscuousSex
@@ -145,33 +161,41 @@
1000
5
-
+
VaginalSex
Sex_Promiscuous
+ Lust
+ 2.0
VaginalSex
Sex_Know_Promiscuous
-
+
AnalSex
Sex_Promiscuous
+ Lust
+ 2.0
AnalSex
Sex_Know_Promiscuous
-
+
MiscSex
Sex_Promiscuous
+ Lust
+ 2.0
MiscSex
Sex_Know_Promiscuous
-
+
PromiscuousSex
Sex_Promiscuous
+ Lust
+ 3.0
PromiscuousSex
diff --git a/Defs/PreceptDefs/Precepts_Submissive.xml b/Defs/PreceptDefs/Precepts_Submissive.xml
new file mode 100644
index 0000000..1d7ab15
--- /dev/null
+++ b/Defs/PreceptDefs/Precepts_Submissive.xml
@@ -0,0 +1,206 @@
+
+
+
+
+
+ Submissive
+ submissive
+ UI/Issues/Submissive
+
+
+
+
+
+ Submissive_None
+ Submissive
+ Normal
+ Just normal.
+ Low
+ 50
+ 1000
+
+
+
+ Submissive_Male
+ Submissive
+ submissive male
+ Males are submissive. They will obey and accept even being raped.
+ High
+ 40
+ 1000
+
+ FemaleSupremacy
+
+
+
+ WasRaped
+ BeenRaped_Submissive
+ Male, BeenRaped
+
+
+ WasRaped
+ BeenRaped_NotSubmissive
+ Female, BeenRaped
+
+
+ Raped
+ Raped_Know_NotBeingSubmissive
+ not obedient
+ Female, Raped
+
+
+ WasRapedPrisoner
+ BeenRaped_Submissive
+ Male, BeenRaped
+
+
+ WasRapedPrisoner
+ BeenRaped_NotSubmissive
+ Female, BeenRaped
+
+
+ RapedPrisoner
+ Raped_Know_NotBeingSubmissive
+ not obedient
+ Female, Raped
+
+
+ WasRapedSlave
+ BeenRaped_Submissive
+ Male, BeenRaped
+
+
+ WasRapedSlave
+ BeenRaped_NotSubmissive
+ Female, BeenRaped
+
+
+ RapedSlave
+ Raped_Know_NotBeingSubmissive
+ not obedient
+ Female, Raped
+
+
+
+
+
+ Submissive_Female
+ Submissive
+ submissive female
+ Females are submissive. They will obey and accept even being raped.
+ High
+ 30
+ 1000
+
+ MaleSupremacy
+
+
+
+ WasRaped
+ BeenRaped_Submissive
+ Female, BeenRaped
+
+
+ WasRaped
+ BeenRaped_NotSubmissive
+ Male, BeenRaped
+
+
+ Raped
+ Raped_Know_NotBeingSubmissive
+ not obedient
+ Male, Raped
+
+
+ WasRapedPrisoner
+ BeenRaped_Submissive
+ Female, BeenRaped
+
+
+ WasRapedPrisoner
+ BeenRaped_NotSubmissive
+ Male, BeenRaped
+
+
+ RapedPrisoner
+ Raped_Know_NotBeingSubmissive
+ not obedient
+ Male, Raped
+
+
+ WasRapedSlave
+ BeenRaped_Submissive
+ Female, BeenRaped
+
+
+ WasRapedSlave
+ BeenRaped_NotSubmissive
+ Male, BeenRaped
+
+
+ RapedSlave
+ Raped_Know_NotBeingSubmissive
+ not obedient
+ Male, Raped
+
+
+
+
+
+
+
+
+
+ BeenRaped_Submissive
+ 10
+ 100
+ Thought_Memory
+ 0.4
+
+ Masochist
+
+
+
+ had been raped
+ I had to accept. But i don't feel so good.
+ -3
+
+
+
+
+
+ BeenRaped_NotSubmissive
+ 15
+ 100
+ Thought_MemorySocial
+ 0.4
+
+ Masochist
+
+
+
+ {0} raped me
+ How dare...
+ -30
+ -200
+
+
+
+
+
+ Raped_Know_NotBeingSubmissive
+ Thought_MemorySocial
+ 15
+ 100
+ 3
+
+ Masochist
+
+
+
+ not obedient
+ -30
+
+
+
+
\ No newline at end of file
diff --git a/Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml b/Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml
new file mode 100644
index 0000000..fdc2c0c
--- /dev/null
+++ b/Defs/PreceptDefs/RitualPatternDefs/RitualPatterns_sex.xml
@@ -0,0 +1,35 @@
+
+
+
+ NamerRitualFestival
+ true
+ RitualSpotOrAltar
+ {0} {1} want to carry out the gangbang as soon as possible.
+
+ Rape
+
+
+
+
+ Gangbang
+ Gangbang
+ gangbang
+ A ritualistic gangbang. The organizer will give a speech to excite the crowd, then fuck the prisoner. If the organizer cannot fuck victim, the ritual will be canceled.
+ UI/Issues/Gangbang
+ false
+
+ Gangbang
+
+
+
+ GangbangByAnimal
+ GangbangByAnimal
+ gangbang by animal
+ A ritualistic animal gangbang. The organizer will give a speech to excite the crowd, then animals begin fuck victim.
+ UI/Commands/Breeding_Pawn_off
+ false
+
+ BestialGangbang
+
+
+
\ No newline at end of file
diff --git a/Defs/Rituals/Ritual_Behaviors_sex.xml b/Defs/Rituals/Ritual_Behaviors_sex.xml
new file mode 100644
index 0000000..ac225d5
--- /dev/null
+++ b/Defs/Rituals/Ritual_Behaviors_sex.xml
@@ -0,0 +1,272 @@
+
+
+
+
+
+ 7500
+
+
+ initiator
+ initiator
+ Initiator
+ IdeoRole_Moralist
+ True
+ true
+ 1
+ False
+
+
+
+
+
+ Gangbang
+ RJWSexperience.RitualBehaviorWorker_Gangbang
+
+
+ victim
+ a victim
+ victim
+ 1
+ True
+ False
+ true
+
+
+
+
+ Spectate
+
+
+
+
+
+ initiator
+ victim
+ Victim is not reachable.
+
+
+
+
+ initiator
+ DeliverPawnToAltar
+
+
+ victim
+ Idle
+
+
+
+
+ Spectate
+
+
+ 0.1
+
+
+
+
+ initiator
+ SpeakOnCellFacingSpectators
+ Speech_Gangbang
+
+
+ 5
+
+
+
+
+
+ victim
+ LayDownAwake
+
+
+
+
+ Gangbang
+ True
+
+
+ 0.9
+
+
+
+
+ initiator
+ FuckVictim
+
+
+
+
+
+ victim
+ LayDownAwake
+
+
+
+
+ Gangbang
+
+
+ 0.1
+
+
+
+
+ initiator
+ SpeakOnCellFacingSpectators
+ Speech_Gangbang
+
+
+
+
+
+ victim
+ LayDownAwake
+
+
+
+
+
+
+
+
+
+ GangbangByAnimal
+
+
+ breedee
+ a breedee who will be fucked by animal
+ victim
+ 1
+ True
+ False
+ true
+
+
+ breeder
+ animal
+ 8
+ True
+ a breedable animal.
+ false
+
+
+
+
+
+
+ initiator
+ victim
+
+
+ Spectate
+ 5~7
+
+
+ initiator
+ victim
+ Victim is not reachable.
+
+
+
+
+
+ initiator
+
+ true
+
+
+
+
+ initiator
+ DeliverPawnToCellIfAliveThenIdle
+
+
+ 2
+ 0
+
+
+
+
+ victim
+ Idle
+
+
+
+
+ Spectate
+
+
+ 0.1
+
+
+
+
+ initiator
+ SpeakOnCellFacingSpectators
+ Speech_Zoophile
+
+
+ 5
+
+
+
+
+
+ animal
+ Spectate
+
+
+ victim
+ LayDownAwake
+
+
+
+
+ Spectate
+ True
+
+
+ 0.9
+
+
+
+
+ animal
+ Gangbang
+
+
+
+
+
+ victim
+ LayDownAwake
+
+
+
+
+ Spectate
+
+
+ 0.1
+
+
+
+
+ initiator
+ SpeakOnCellFacingSpectators
+ Speech_Zoophile
+
+
+
+
+
+ victim
+ LayDownAwake
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Defs/Rituals/Ritual_Outcomes_sex.xml b/Defs/Rituals/Ritual_Outcomes_sex.xml
new file mode 100644
index 0000000..7bad3ba
--- /dev/null
+++ b/Defs/Rituals/Ritual_Outcomes_sex.xml
@@ -0,0 +1,183 @@
+
+
+
+ Gangbang
+ Depending on ritual quality, participants will get between {MINMOOD} and {MAXMOOD} mood for {MOODDAYS} days.
+ RitualOutcomeEffectWorker_Consumable
+
+ If the {0} is satisfying, one of the participants might gain an inspiration.
+
+
+
+ moralist
+ moral guide present
+ 0.10
+
+
+ participant count
+
+
+ (1, -0.20)
+ (3, -0.05)
+ (5, 0.05)
+ (10, 0.10)
+
+
+
+
+ true
+ started at altar
+ 0.2
+ an altar
+
+
+ victim broken
+ 0.2
+ FeelingBroken
+ 0.3
+ victim
+
+
+ victim extremly broken
+ 0.2
+ FeelingBroken
+ 0.5
+ victim
+
+
+ victim completely broken
+ 0.4
+ FeelingBroken
+ 0.9
+ victim
+
+
+ statisfied participants
+ 0.2
+ Sex
+ 0.7
+
+
+
+
+ Terrible
+ 0.05
+ TerribleGangbang
+ The {0} was terrible! The speech was stuttering and incoherent, and the victim was botched - everyone was waiting for it to end.
+ -2
+
+
+ Boring
+ 0.15
+ BoringGangbang
+ The {0} was boring. The speech was repetitive and the victim was noticeably flawed. It just didn't feel dignified.
+ -1
+
+
+ Satisfying
+ 0.6
+ FunGangbang
+ The {0} was satisfying. The speech felt meaningful, and the victim was precise and dignified.
+ There's a 5% chance that a random participant gets an inspiration.
+ 1
+
+
+ Spectacular
+ 0.2
+ UnforgettableGangbang
+ The {0} was spectacular! The speech brought everyone to the edge of a frenzy and the victim was like succubus.
+ There's a 10% chance that a random participant gets an inspiration.
+ 2
+
+
+
+
+
+
+ BestialGangbang
+ Depending on ritual quality, participants will get between {MINMOOD} and {MAXMOOD} mood for {MOODDAYS} days.
+ RitualOutcomeEffectWorker_Consumable
+
+ If the {0} is satisfying, one of the participants might gain an inspiration.
+
+
+
+ moralist
+ moral guide present
+ 0.10
+
+
+ participant count
+
+
+ (1, -0.50)
+ (3, -0.30)
+ (5, -0.15)
+ (10, -0.10)
+
+
+
+
+ true
+ started at altar
+ 0.2
+ an altar
+
+
+ breedee broken
+ 0.3
+ FeelingBroken
+ 0.3
+ victim
+
+
+ breedee extremly broken
+ 0.3
+ FeelingBroken
+ 0.5
+ victim
+
+
+ breedee completely broken
+ 0.6
+ FeelingBroken
+ 0.9
+ victim
+
+
+
+
+ Terrible
+ 0.05
+ TerribleGangbang
+ The {0} was terrible! The speech was stuttering and incoherent, and the victim was botched - everyone was waiting for it to end.
+ -2
+
+
+ Boring
+ 0.15
+ BoringGangbang
+ The {0} was boring. The speech was repetitive and the victim was noticeably flawed. It just didn't feel dignified.
+ -1
+
+
+ Satisfying
+ 0.6
+ FunGangbang
+ The {0} was satisfying. The speech felt meaningful, and the victim was precise and dignified.
+ There's a 5% chance that a random participant gets an inspiration.
+ 1
+
+
+ Spectacular
+ 0.2
+ UnforgettableGangbang
+ The {0} was spectacular! The speech brought everyone to the edge of a frenzy and the victim was like succubus.
+ There's a 10% chance that a random participant gets an inspiration.
+ 2
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Defs/Rituals/Ritual_Targets_sex.xml b/Defs/Rituals/Ritual_Targets_sex.xml
new file mode 100644
index 0000000..67e9ca5
--- /dev/null
+++ b/Defs/Rituals/Ritual_Targets_sex.xml
@@ -0,0 +1,7 @@
+
+
+
+ RitualSpotOrAltar_Gangbang
+ RitualObligationTargetWorker_AnyRitualSpotOrAltar_Scarification
+
+
\ No newline at end of file
diff --git a/Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml b/Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml
new file mode 100644
index 0000000..be1c2ed
--- /dev/null
+++ b/Defs/ThoughtDefs/Thoughts_Ritual_sex_Quality.xml
@@ -0,0 +1,60 @@
+
+
+
+
+ TerribleGangbang
+ Thought_AttendedRitual
+ 6
+ 3
+
+
+ terrible gangbang
+ That gangbang was terrible. ugh.
+ -3
+
+
+
+
+
+ BoringGangbang
+ Thought_AttendedRitual
+ 6
+ 3
+
+
+ boring gangbang
+ That gangbang was not good. Wish I never went.
+ -1
+
+
+
+
+
+ FunGangbang
+ Thought_AttendedRitual
+ 6
+ 3
+
+
+ fun gangbang
+ That was a fun gangbang. It really satisfied me.
+ 8
+
+
+
+
+
+ UnforgettableGangbang
+ Thought_AttendedRitual
+ 6
+ 3
+
+
+ unforgettable gangbang
+ That gangbang was awesome! Everything was perfect.
+ 16
+
+
+
+
+
\ No newline at end of file
diff --git a/Languages/English/Keyed/RJW_Sexperience.xml b/Languages/English/Keyed/RJW_Sexperience.xml
index bb1c8f7..363f408 100644
--- a/Languages/English/Keyed/RJW_Sexperience.xml
+++ b/Languages/English/Keyed/RJW_Sexperience.xml
@@ -1,7 +1,33 @@
+ RJW Sexperience
+
Lust: x{0}%
Slave: x{0}%
Not Slave: x100%
Meme: x{0}%
+
+ Enable record randomizer
+ Randomize pawn's sex records.
+ Lust effect power
+ Set how much lust affect to sex drive.
+ Maximum lust deviation
+ Set maximum deviation of lust.
The lust value can be negative depending on its average.
+ Average Lust
+ Set average of lust.
+ Maximum sex count deviation
+ Set maximum deviation of sex count.
+ Average sex count per year
+ Set average sex count.
+ Enable slaves get raped experience
+ Slaves will have experience of being raped
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Languages/Korean/DefInjected/IssueDefs/Translations_IssueDefs.xml b/Languages/Korean/DefInjected/IssueDefs/Translations_IssueDefs.xml
index 684bdcc..205fde2 100644
--- a/Languages/Korean/DefInjected/IssueDefs/Translations_IssueDefs.xml
+++ b/Languages/Korean/DefInjected/IssueDefs/Translations_IssueDefs.xml
@@ -4,4 +4,5 @@
강간
수간
근친상간
+ 순종적인 성별
\ No newline at end of file
diff --git a/Languages/Korean/DefInjected/MemeDefs/Translations_MemeDef.xml b/Languages/Korean/DefInjected/MemeDefs/Translations_MemeDef.xml
index ad28ac0..0a3aa60 100644
--- a/Languages/Korean/DefInjected/MemeDefs/Translations_MemeDef.xml
+++ b/Languages/Korean/DefInjected/MemeDefs/Translations_MemeDef.xml
@@ -21,10 +21,10 @@
memeConcept->수간
memeConcept->수간
memeLeaderNoun->가축
- 번식모판
+ 브리더
번식
수간
- 번식기
+ 브리더
포켓몬스터 갤러리
수간
수간
diff --git a/Languages/Korean/DefInjected/PreceptDefs/Translations_PreceptDefs.xml b/Languages/Korean/DefInjected/PreceptDefs/Translations_PreceptDefs.xml
index 2302e33..6aff5db 100644
--- a/Languages/Korean/DefInjected/PreceptDefs/Translations_PreceptDefs.xml
+++ b/Languages/Korean/DefInjected/PreceptDefs/Translations_PreceptDefs.xml
@@ -16,6 +16,7 @@
장려됨
수간은 장려되어야 합니다.
수간
+
혐오스러움
강간은 절대 용납할수 없는 행위입니다.
강간
@@ -36,6 +37,7 @@
자랑스러움
강간은 자랑할만한 일입니다.
강간
+
자유
어떠한것도 배척받지 않습니다.
성기만 사용
@@ -46,6 +48,7 @@
구강성교만이 일반적인 것으로 받아들여집니다. 그 외에는 문란한것으로 간주됩니다.
문란함
문란한 성생활이 선호됩니다.
+
자유
근친상간이 허용됩니다.
가까운 친척만 싫어함
@@ -56,4 +59,12 @@
근친상간은 용납되지 않습니다.
근친만 가능
순수혈통을 보존하기위해 근친상간만을 허용합니다.
+
+ 없음
+ 평범합니다.
+ 순종적인 남성
+ 남성들은 순종적입니다. 심지어 강간당하더라도 받아들일 것입니다.
+ 순종적인 여성
+ 여성들은 순종적입니다. 심지어 강간당하더라도 받아들일 것입니다.
+
\ No newline at end of file
diff --git a/Languages/Korean/DefInjected/RitualOutcomeEffectDefs/Translations_RitualOutcomeEffectDefs.xml b/Languages/Korean/DefInjected/RitualOutcomeEffectDefs/Translations_RitualOutcomeEffectDefs.xml
new file mode 100644
index 0000000..7f07cf6
--- /dev/null
+++ b/Languages/Korean/DefInjected/RitualOutcomeEffectDefs/Translations_RitualOutcomeEffectDefs.xml
@@ -0,0 +1,9 @@
+
+
+ 제단에서 시작
+ 희생양 무너짐
+ 제단에서 시작
+ 제단에서 시작
+ 제단에서 시작
+
+
\ No newline at end of file
diff --git a/Languages/Korean/DefInjected/ThoughtDefs/Translations_ThoughtDef.xml b/Languages/Korean/DefInjected/ThoughtDefs/Translations_ThoughtDef.xml
index 7c5c980..1b7d3dc 100644
--- a/Languages/Korean/DefInjected/ThoughtDefs/Translations_ThoughtDef.xml
+++ b/Languages/Korean/DefInjected/ThoughtDefs/Translations_ThoughtDef.xml
@@ -41,6 +41,10 @@
근친
근친
혈족이 아닌사람과 성관계
- 혈통을 더럽힘
+ 강간당함
+ 받아들여야해. 하지만 기분이 안좋아.
+ {0}에게 강간당함
+ 어떻게 감히...
+ 순종적이지 않음
\ No newline at end of file
diff --git a/Languages/Korean/Keyed/RJW_Sexperience.xml b/Languages/Korean/Keyed/RJW_Sexperience.xml
index c337d3f..1c469a2 100644
--- a/Languages/Korean/Keyed/RJW_Sexperience.xml
+++ b/Languages/Korean/Keyed/RJW_Sexperience.xml
@@ -1,7 +1,32 @@
+ RJW Sexperience
+
음란함: x{0}%
노예: x{0}%
노예가 아님: x100%
문화 요소: x{0}%
+
+ 기록 생성기 활성화
+ 폰의 섹스기록을 무작위로 생성합니다.
+ 음란함 효과 강도
+ 음란함이 성욕에 얼마나 영향을 미칠지 설정합니다.
+ 음란함 최대 편차
+ 음란함의 최대 편차를 설정합니다.
평균에 따라 음수가 나올수도 있습니다.
+ 평균 음란함
+ 음란함의 평균을 설정합니다.
+ 섹스횟수 최대 편차
+ 섹스횟수의 최대 편차를 설정합니다.
+ 연평균 섹스 횟수
+ 평균 섹스 횟수를 설정합니다.
+ 노예 강간 경험 활성화
+ 활성화할 경우 노예는 강간당한 경험을 가집니다.
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Patches/RJW_ThoughtDefs.xml b/Patches/RJW_ThoughtDefs.xml
index 01a6142..e52f0c9 100644
--- a/Patches/RJW_ThoughtDefs.xml
+++ b/Patches/RJW_ThoughtDefs.xml
@@ -79,4 +79,24 @@
+
+
+ Defs/ThoughtDef[defName="GotRaped" or defName="GotAnalRaped" or defName="GotAnalRapedByFemale" or defName="GotRapedUnconscious" or defName="HateMyRapist" or defName="AllowedMeToGetRaped"]/nullifyingPrecepts
+
+ Defs/ThoughtDef[defName="GotRaped" or defName="GotAnalRaped" or defName="GotAnalRapedByFemale" or defName="GotRapedUnconscious" or defName="HateMyRapist" or defName="AllowedMeToGetRaped"]
+
+
+ Submissive_Male
+ Submissive_Female
+
+
+
+
+ Defs/ThoughtDef[defName="GotRaped" or defName="GotAnalRaped" or defName="GotAnalRapedByFemale" or defName="GotRapedUnconscious" or defName="HateMyRapist" or defName="AllowedMeToGetRaped"]/nullifyingPrecepts
+
+ Submissive_Male
+ Submissive_Female
+
+
+
\ No newline at end of file
diff --git a/RJWSexperience/RJWSexperience/Configurations.cs b/RJWSexperience/RJWSexperience/Configurations.cs
new file mode 100644
index 0000000..bcc8940
--- /dev/null
+++ b/RJWSexperience/RJWSexperience/Configurations.cs
@@ -0,0 +1,149 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using RimWorld;
+using UnityEngine;
+using Verse;
+
+
+
+
+namespace RJWSexperience
+{
+ public class Configurations : ModSettings
+ {
+ public const float MaxInitialLustDefault = 500;
+ public const float AvgLustDefault = 0;
+ public const float MaxSexCountDeviationDefault = 90;
+ public const float LustEffectPowerDefault = 0.5f;
+ public const float SexPerYearDefault = 30;
+ public const bool SlavesBeenRapedExpDefault = true;
+ public const bool EnableStatRandomizerDefault = true;
+
+ public static float MaxLustDeviation = MaxInitialLustDefault;
+ public static float AvgLust = AvgLustDefault;
+ public static float MaxSexCountDeviation = MaxSexCountDeviationDefault;
+ public static float LustEffectPower = LustEffectPowerDefault;
+ public static float SexPerYear = SexPerYearDefault;
+ public static bool SlavesBeenRapedExp = SlavesBeenRapedExpDefault;
+ public static bool EnableRecordRandomizer = EnableStatRandomizerDefault;
+
+ public static void ResettoDefault()
+ {
+ MaxLustDeviation = MaxInitialLustDefault;
+ AvgLust = AvgLustDefault;
+ MaxSexCountDeviation = MaxSexCountDeviationDefault;
+ LustEffectPower = LustEffectPowerDefault;
+ SexPerYear = SexPerYearDefault;
+ SlavesBeenRapedExp = SlavesBeenRapedExpDefault;
+ EnableRecordRandomizer = EnableStatRandomizerDefault;
+ }
+
+ public override void ExposeData()
+ {
+ Scribe_Values.Look(ref MaxLustDeviation, "MaxLustDeviation", MaxLustDeviation);
+ Scribe_Values.Look(ref AvgLust, "AvgLust", AvgLust);
+ Scribe_Values.Look(ref MaxSexCountDeviation, "MaxSexCountDeviation", MaxSexCountDeviation);
+ Scribe_Values.Look(ref LustEffectPower, "LustEffectPower", LustEffectPower);
+ Scribe_Values.Look(ref SexPerYear, "SexPerYear", SexPerYear);
+ Scribe_Values.Look(ref SlavesBeenRapedExp, "SlavesBeenRapedExp", SlavesBeenRapedExp);
+ Scribe_Values.Look(ref EnableRecordRandomizer, "EnableRecordRandomizer", EnableRecordRandomizer);
+
+
+ base.ExposeData();
+ }
+ }
+
+ public class RJWSexperience : Mod
+ {
+ private readonly Configurations config;
+ private static Vector2 scroll;
+
+ public RJWSexperience(ModContentPack content) : base(content)
+ {
+ config = GetSettings();
+ }
+
+ public override string SettingsCategory()
+ {
+ return Keyed.Mod_Title;
+ }
+
+ public override void DoSettingsWindowContents(Rect inRect)
+ {
+ int Adjuster;
+ Rect outRect = new Rect(0f, 30f, inRect.width, inRect.height - 30f);
+ Rect mainRect = new Rect(0f, 0f, inRect.width - 30f, inRect.height + 480f);
+ Listing_Standard listmain = new Listing_Standard();
+ listmain.maxOneColumn = true;
+ Widgets.BeginScrollView(outRect, ref scroll, mainRect);
+ listmain.Begin(mainRect);
+ listmain.Gap(20f);
+
+ listmain.CheckboxLabeled(Keyed.Option_1_Label, ref Configurations.EnableRecordRandomizer, Keyed.Option_1_Desc);
+ if (Configurations.EnableRecordRandomizer)
+ {
+ Listing_Standard section = listmain.BeginSection(24f*11f);
+
+ LabelwithTextfield(section.GetRect(24f), Keyed.Option_2_Label + " x" + Configurations.LustEffectPower, Keyed.Option_2_Desc, ref Configurations.LustEffectPower, 0f, 100f);
+ Adjuster = (int)(Configurations.LustEffectPower * 1000);
+ //listmain.Label(Keyed.Option_2_Label + " x" + Configurations.LustEffectPower , -1, Keyed.Option_2_Desc);
+ Adjuster = (int)section.Slider(Adjuster, 0, 2000);
+ Configurations.LustEffectPower = (float)Adjuster / 1000;
+
+ LabelwithTextfield(section.GetRect(24f), Keyed.Option_3_Label + " " + Configurations.MaxLustDeviation, Keyed.Option_3_Label, ref Configurations.MaxLustDeviation, 0f, 2000f);
+ Adjuster = (int)Configurations.MaxLustDeviation;
+ //listmain.Label(Keyed.Option_3_Label + " " + Configurations.MaxLustDeviation, -1, Keyed.Option_3_Desc);
+ Adjuster = (int)section.Slider(Adjuster, 0, 2000);
+ Configurations.MaxLustDeviation = Adjuster;
+
+ LabelwithTextfield(section.GetRect(24f), Keyed.Option_4_Label + " " + Configurations.AvgLust, Keyed.Option_4_Desc, ref Configurations.AvgLust, -1000f, 1000f);
+ Adjuster = (int)Configurations.AvgLust;
+ //listmain.Label(Keyed.Option_4_Label + " " + Configurations.AvgLust, -1, Keyed.Option_4_Desc);
+ Adjuster = (int)section.Slider(Adjuster, -1000, 1000);
+ Configurations.AvgLust = Adjuster;
+
+ LabelwithTextfield(section.GetRect(24f), Keyed.Option_5_Label + " " + Configurations.MaxSexCountDeviation, Keyed.Option_5_Desc, ref Configurations.MaxSexCountDeviation, 0f, 2000f);
+ Adjuster = (int)Configurations.MaxSexCountDeviation;
+ //listmain.Label(Keyed.Option_5_Label + " " + Configurations.MaxSexCountDeviation, -1, Keyed.Option_5_Desc);
+ Adjuster = (int)section.Slider(Adjuster, 0, 2000);
+ Configurations.MaxSexCountDeviation = Adjuster;
+
+ LabelwithTextfield(section.GetRect(24f), Keyed.Option_6_Label + " " + Configurations.SexPerYear, Keyed.Option_6_Desc, ref Configurations.SexPerYear, 0f, 2000f);
+ Adjuster = (int)Configurations.SexPerYear;
+ //listmain.Label(Keyed.Option_6_Label + " " + Configurations.SexPerYear, -1, Keyed.Option_6_Desc);
+ Adjuster = (int)section.Slider(Adjuster, 0, 2000);
+ Configurations.SexPerYear = Adjuster;
+
+
+ section.CheckboxLabeled(Keyed.Option_7_Label, ref Configurations.SlavesBeenRapedExp, Keyed.Option_7_Desc);
+
+ listmain.EndSection(section);
+ }
+
+
+ if (listmain.ButtonText("reset to default"))
+ {
+ Configurations.ResettoDefault();
+ }
+ listmain.End();
+ Widgets.EndScrollView();
+
+ }
+
+ public void LabelwithTextfield(Rect rect, string label, string tooltip, ref float value, float min, float max)
+ {
+ Rect textfieldRect = new Rect(rect.xMax - 100f, rect.y, 100f, rect.height);
+ string valuestr = value.ToString();
+ Widgets.Label(rect, label);
+ Widgets.TextFieldNumeric(textfieldRect,ref value, ref valuestr, min, max);
+ Widgets.DrawHighlightIfMouseover(rect);
+ TooltipHandler.TipRegion(rect, tooltip);
+ }
+
+
+ }
+
+}
diff --git a/RJWSexperience/RJWSexperience/Keyed.cs b/RJWSexperience/RJWSexperience/Keyed.cs
index a7ad31f..38013f1 100644
--- a/RJWSexperience/RJWSexperience/Keyed.cs
+++ b/RJWSexperience/RJWSexperience/Keyed.cs
@@ -11,11 +11,35 @@ namespace RJWSexperience
{
public static class Keyed
{
- public static string LustStatFactor(float value) => "LustStatFactor".Translate(value);
- public static string SlaveStatFactor(float value) => "SlaveStatFactor".Translate(value);
- public static string MemeStatFactor(float value) => "MemeStatFactor".Translate(value);
+ public static string LustStatFactor(string value) => "LustStatFactor".Translate(value);
+ public static string SlaveStatFactor(string value) => "SlaveStatFactor".Translate(value);
+ public static string MemeStatFactor(string value) => "MemeStatFactor".Translate(value);
+ public static readonly string Mod_Title = "RS_Mod_Title".Translate();
public static readonly string SlaveStatFactorDefault = "SlaveStatFactorDefault".Translate();
+ public static readonly string Option_1_Label = "RSOption_1_Label".Translate();
+ public static readonly string Option_1_Desc = "RSOption_1_Desc".Translate();
+ public static readonly string Option_2_Label = "RSOption_2_Label".Translate();
+ public static readonly string Option_2_Desc = "RSOption_2_Desc".Translate();
+ public static readonly string Option_3_Label = "RSOption_3_Label".Translate();
+ public static readonly string Option_3_Desc = "RSOption_3_Desc".Translate();
+ public static readonly string Option_4_Label = "RSOption_4_Label".Translate();
+ public static readonly string Option_4_Desc = "RSOption_4_Desc".Translate();
+ public static readonly string Option_5_Label = "RSOption_5_Label".Translate();
+ public static readonly string Option_5_Desc = "RSOption_5_Desc".Translate();
+ public static readonly string Option_6_Label = "RSOption_6_Label".Translate();
+ public static readonly string Option_6_Desc = "RSOption_6_Desc".Translate();
+ public static readonly string Option_7_Label = "RSOption_7_Label".Translate();
+ public static readonly string Option_7_Desc = "RSOption_7_Desc".Translate();
+ public static readonly string Option_8_Label = "RSOption_8_Label".Translate();
+ public static readonly string Option_8_Desc = "RSOption_8_Desc".Translate();
+ public static readonly string Option_9_Label = "RSOption_9_Label".Translate();
+ public static readonly string Option_9_Desc = "RSOption_9_Desc".Translate();
+ public static readonly string Option_10_Label = "RSOption_10_Label".Translate();
+ public static readonly string Option_10_Desc = "RSOption_10_Desc".Translate();
+ public static readonly string Option_11_Label = "RSOption_11_Label".Translate();
+ public static readonly string Option_11_Desc = "RSOption_11_Desc".Translate();
+
}
}
diff --git a/RJWSexperience/RJWSexperience/PreceptComp_SelftTookThoughtExtended.cs b/RJWSexperience/RJWSexperience/PreceptComp_SelftTookThoughtExtended.cs
index 90bb850..7047b63 100644
--- a/RJWSexperience/RJWSexperience/PreceptComp_SelftTookThoughtExtended.cs
+++ b/RJWSexperience/RJWSexperience/PreceptComp_SelftTookThoughtExtended.cs
@@ -17,15 +17,18 @@ namespace RJWSexperience
public static class HETag
{
public const string Incestous = "[Incestuos]";
- public const string Raped = "[Raped]";
+ public const string BeenRaped = "[BeenRaped]";
public const string Rape = "[Rape]";
+ public static string Gender(Pawn pawn) => "[" + pawn.gender + "]";
+
}
public class PreceptComp_SelfTookThoughtTagged : PreceptComp_SelfTookMemoryThought
{
public string tag;
public bool exclusive = false;
-
+ public RecordDef recordDef;
+ public float? recordoffset;
public PreceptComp_SelfTookThoughtTagged() { }
@@ -35,19 +38,75 @@ namespace RJWSexperience
{
if (ev.args.TryGetArg(HistoryEventArgsNamesCustom.Tag, out string tags))
{
- if (tags.ToLower().Contains(tag.ToLower()) ^ exclusive) base.Notify_MemberTookAction(ev, precept, canApplySelfTookThoughts);
+ if (tags.ContainAll(tag.Replace(" ","").Split(',')) ^ exclusive)
+ {
+ TookThought(ev, precept, canApplySelfTookThoughts);
+ if (ev.args.TryGetArg(HistoryEventArgsNames.Doer, out Pawn pawn))
+ {
+ AdjustRecord(pawn);
+ }
+ }
}
else if (exclusive)
{
- base.Notify_MemberTookAction(ev, precept, canApplySelfTookThoughts);
+ TookThought(ev, precept, canApplySelfTookThoughts);
+ if (ev.args.TryGetArg(HistoryEventArgsNames.Doer, out Pawn pawn))
+ {
+ AdjustRecord(pawn);
+ }
}
}
else
{
- base.Notify_MemberTookAction(ev, precept, canApplySelfTookThoughts);
+ TookThought(ev, precept, canApplySelfTookThoughts);
+ if (ev.args.TryGetArg(HistoryEventArgsNames.Doer, out Pawn pawn))
+ {
+ AdjustRecord(pawn);
+ }
}
}
+
+ protected virtual void TookThought(HistoryEvent ev, Precept precept, bool canApplySelfTookThoughts)
+ {
+ if (ev.def != this.eventDef || !canApplySelfTookThoughts)
+ {
+ return;
+ }
+ Pawn arg = ev.args.GetArg(HistoryEventArgsNames.Doer);
+ Pawn partner = ev.args.GetArg(HistoryEventArgsNamesCustom.Partner);
+ if (arg.needs != null && arg.needs.mood != null && (!this.onlyForNonSlaves || !arg.IsSlave))
+ {
+ if (this.thought.minExpectationForNegativeThought != null && ExpectationsUtility.CurrentExpectationFor(arg).order < this.thought.minExpectationForNegativeThought.order)
+ {
+ return;
+ }
+ Thought_Memory thought_Memory = ThoughtMaker.MakeThought(this.thought, precept);
+ Thought_KilledInnocentAnimal thought_KilledInnocentAnimal;
+ Pawn animal;
+ if ((thought_KilledInnocentAnimal = (thought_Memory as Thought_KilledInnocentAnimal)) != null && ev.args.TryGetArg(HistoryEventArgsNames.Victim, out animal))
+ {
+ thought_KilledInnocentAnimal.SetAnimal(animal);
+ }
+ Thought_MemoryObservation thought_MemoryObservation;
+ Corpse target;
+ if ((thought_MemoryObservation = (thought_Memory as Thought_MemoryObservation)) != null && ev.args.TryGetArg(HistoryEventArgsNames.Subject, out target))
+ {
+ thought_MemoryObservation.Target = target;
+ }
+ arg.needs.mood.thoughts.memories.TryGainMemory(thought_Memory, partner);
+ }
+ }
+
+
+ protected void AdjustRecord(Pawn pawn)
+ {
+ if (recordDef != null)
+ {
+ pawn.records.AddTo(recordDef, recordoffset ?? 1f);
+ }
+ }
+
}
@@ -73,7 +132,7 @@ namespace RJWSexperience
{
if (ev.args.TryGetArg(HistoryEventArgsNamesCustom.Tag, out string tags))
{
- if (tags.ToLower().Contains(tag.ToLower()) ^ exclusive) base.Notify_MemberWitnessedAction(ev, precept, member);
+ if (tags.ContainAll(tag.Replace(" ", "").Split(',')) ^ exclusive) base.Notify_MemberWitnessedAction(ev, precept, member);
}
else if (exclusive)
{
diff --git a/RJWSexperience/RJWSexperience/RJWSexperience.csproj b/RJWSexperience/RJWSexperience/RJWSexperience.csproj
index 970d2be..c338c17 100644
--- a/RJWSexperience/RJWSexperience/RJWSexperience.csproj
+++ b/RJWSexperience/RJWSexperience/RJWSexperience.csproj
@@ -77,11 +77,16 @@
+
+
+
+
+
diff --git a/RJWSexperience/RJWSexperience/RJW_Patch.cs b/RJWSexperience/RJWSexperience/RJW_Patch.cs
index b281c19..10ab7a5 100644
--- a/RJWSexperience/RJWSexperience/RJW_Patch.cs
+++ b/RJWSexperience/RJWSexperience/RJW_Patch.cs
@@ -207,11 +207,13 @@ namespace RJWSexperience
if (isHumanReceiving && rape)
{
if (human.IsSlave) RapeEffectSlave(human);
+ if (human.Ideo?.IsVeneratedAnimal(partner) ?? false) Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithVeneratedAnimal.TaggedEvent(human, tag + HETag.BeenRaped + HETag.Gender(human), partner));
+ else Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithAnimal.TaggedEvent(human, tag + HETag.BeenRaped + HETag.Gender(human), partner));
}
else
{
- if (human.Ideo?.IsVeneratedAnimal(partner) ?? false) Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithVeneratedAnimal.TaggedEvent(human, tag, partner));
- else Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithAnimal.TaggedEvent(human, tag, partner));
+ if (human.Ideo?.IsVeneratedAnimal(partner) ?? false) Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithVeneratedAnimal.TaggedEvent(human, tag + HETag.Gender(human), partner));
+ else Find.HistoryEventsManager.RecordEvent(VariousDefOf.SexWithAnimal.TaggedEvent(human, tag + HETag.Gender(human), partner));
}
}
else if (xxx.is_human(partner))
@@ -220,20 +222,20 @@ namespace RJWSexperience
{
if (partner.IsSlave)
{
- Find.HistoryEventsManager.RecordEvent(VariousDefOf.RapedSlave.TaggedEvent(human ,tag + HETag.Rape ,partner));
- Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRapedSlave.TaggedEvent(partner, tag + HETag.Raped, human));
+ Find.HistoryEventsManager.RecordEvent(VariousDefOf.RapedSlave.TaggedEvent(human ,tag + HETag.Rape + HETag.Gender(human), partner));
+ Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRapedSlave.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
RapeEffectSlave(partner);
}
else if (partner.IsPrisoner)
{
- Find.HistoryEventsManager.RecordEvent(VariousDefOf.RapedPrisoner.TaggedEvent(human, tag + HETag.Rape, partner));
- Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRapedPrisoner.TaggedEvent(partner, tag + HETag.Raped, human));
+ Find.HistoryEventsManager.RecordEvent(VariousDefOf.RapedPrisoner.TaggedEvent(human, tag + HETag.Rape + HETag.Gender(human), partner));
+ Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRapedPrisoner.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
partner.guest.will = Math.Max(0, partner.guest.will - 0.2f);
}
else
{
- Find.HistoryEventsManager.RecordEvent(VariousDefOf.Raped.TaggedEvent(human, tag + HETag.Rape, partner));
- Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRaped.TaggedEvent(partner, tag + HETag.Raped, human));
+ Find.HistoryEventsManager.RecordEvent(VariousDefOf.Raped.TaggedEvent(human, tag + HETag.Rape + HETag.Gender(human), partner));
+ Find.HistoryEventsManager.RecordEvent(VariousDefOf.WasRaped.TaggedEvent(partner, tag + HETag.BeenRaped + HETag.Gender(partner), human));
}
}
else
@@ -241,12 +243,12 @@ namespace RJWSexperience
HistoryEventDef sexevent = GetSexHistoryDef(sextype);
if (sexevent != null)
{
- Find.HistoryEventsManager.RecordEvent(sexevent.TaggedEvent(human, tag, partner));
- Find.HistoryEventsManager.RecordEvent(sexevent.TaggedEvent(partner, tag, human));
+ Find.HistoryEventsManager.RecordEvent(sexevent.TaggedEvent(human, tag + HETag.Gender(human), partner));
+ Find.HistoryEventsManager.RecordEvent(sexevent.TaggedEvent(partner, tag + HETag.Gender(partner), human));
if (sexevent == VariousDefOf.PromiscuousSex)
{
- human.records.AddTo(VariousDefOf.Lust, 3.0f);
- partner.records.AddTo(VariousDefOf.Lust, 3.0f);
+ human.records.AddTo(VariousDefOf.Lust, 1.0f);
+ partner.records.AddTo(VariousDefOf.Lust, 1.0f);
}
}
@@ -373,26 +375,33 @@ namespace RJWSexperience
{
public static void Postfix(Pawn fucker, Pawn fucked, bool invert_opinion, bool ignore_bleeding, bool ignore_gender, ref float __result)
{
- Ideo ideo = fucker.Ideo;
- if (ideo != null)
+ if (xxx.is_human(fucker))
{
- if (fucker.IsIncest(fucked))
+ Ideo ideo = fucker.Ideo;
+ if (ideo != null)
{
- if (ideo.HasPrecept(VariousDefOf.Incestuos_IncestOnly)) __result *= 2.0f;
- else if (!fucker.relations?.DirectRelationExists(PawnRelationDefOf.Spouse, fucked) ?? false)
+ if (fucker.IsIncest(fucked))
{
- if (ideo.HasPrecept(VariousDefOf.Incestuos_Disapproved)) __result *= 0.5f;
- else if (ideo.HasPrecept(VariousDefOf.Incestuos_Forbidden)) __result *= 0.1f;
+ if (ideo.HasPrecept(VariousDefOf.Incestuos_IncestOnly)) __result *= 2.0f;
+ else if (!fucker.relations?.DirectRelationExists(PawnRelationDefOf.Spouse, fucked) ?? false)
+ {
+ if (ideo.HasPrecept(VariousDefOf.Incestuos_Disapproved)) __result *= 0.5f;
+ else if (ideo.HasPrecept(VariousDefOf.Incestuos_Forbidden)) __result *= 0.1f;
+ }
+ }
+ if (fucked.IsAnimal())
+ {
+ if (ideo.HasPrecept(VariousDefOf.Bestiality_Honorable)) __result *= 2.0f;
+ else if (ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated))
+ {
+ if (ideo.IsVeneratedAnimal(fucked)) __result *= 2.0f;
+ else __result *= 0.05f;
+ }
+ else if (ideo.HasPrecept(VariousDefOf.Bestiality_Acceptable)) __result *= 1.0f;
+ else __result *= 0.5f;
}
- }
- if (fucked.IsAnimal())
- {
- if (ideo.HasPrecept(VariousDefOf.Bestiality_Honorable)) __result *= 2.0f;
- else if (ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated) && ideo.IsVeneratedAnimal(fucked)) __result *= 2.0f;
- else if (ideo.HasPrecept(VariousDefOf.Bestiality_Acceptable)) __result *= 1.0f;
- else __result *= 0.5f;
- }
+ }
}
}
diff --git a/RJWSexperience/RJWSexperience/Rimworld_Patch.cs b/RJWSexperience/RJWSexperience/Rimworld_Patch.cs
index 848f81e..76c6599 100644
--- a/RJWSexperience/RJWSexperience/Rimworld_Patch.cs
+++ b/RJWSexperience/RJWSexperience/Rimworld_Patch.cs
@@ -8,6 +8,9 @@ using RimWorld;
using Verse;
using rjw;
+
+
+
namespace RJWSexperience
{
[HarmonyPatch(typeof(MarriageCeremonyUtility), "Married")]
@@ -47,52 +50,60 @@ namespace RJWSexperience
if (__result != null && !request.Newborn && xxx.is_human(__result))
{
float avgsex = -500;
- float lust = __result.RecordRandomizer(VariousDefOf.Lust, 0, 500, float.MinValue);
- float sexableage = 0;
- if (__result.ageTracker.AgeBiologicalYears > RJWSettings.sex_minimum_age)
- {
- sexableage = __result.ageTracker.AgeBiologicalYearsFloat - RJWSettings.sex_minimum_age;
- avgsex = sexableage * Rand.Range(0,30) + lust;
- }
- float totalsex = 0;
+
+ int totalsex = 0;
float totalbirth = 0;
if (__result.story != null)
{
+ float lust;
+ if (xxx.is_nympho(__result)) lust = __result.RecordRandomizer(VariousDefOf.Lust, Configurations.AvgLust, Configurations.MaxLustDeviation, 0);
+ else lust = __result.RecordRandomizer(VariousDefOf.Lust, Configurations.AvgLust, Configurations.MaxLustDeviation, float.MinValue);
+
+ float sexableage = 0;
+ if (__result.ageTracker.AgeBiologicalYears > RJWSettings.sex_minimum_age)
+ {
+ sexableage = __result.ageTracker.AgeBiologicalYearsFloat - RJWSettings.sex_minimum_age;
+ avgsex = sexableage * Configurations.SexPerYear * __result.LustFactor();
+ }
+
+
if (xxx.is_rapist(__result))
{
if (xxx.is_zoophile(__result))
{
- if (__result.Has(Quirk.ChitinLover)) totalsex += __result.RecordRandomizer(xxx.CountOfRapedInsects, avgsex, 90);
- else totalsex += __result.RecordRandomizer(xxx.CountOfRapedAnimals, avgsex, 90);
+ if (__result.Has(Quirk.ChitinLover)) totalsex += (int)__result.RecordRandomizer(xxx.CountOfRapedInsects, avgsex, Configurations.MaxSexCountDeviation);
+ else totalsex += (int)__result.RecordRandomizer(xxx.CountOfRapedAnimals, avgsex, Configurations.MaxSexCountDeviation);
}
- else totalsex += __result.RecordRandomizer(xxx.CountOfRapedHumanlikes, avgsex, 90);
- avgsex /= 2;
+ else totalsex += (int)__result.RecordRandomizer(xxx.CountOfRapedHumanlikes, avgsex, Configurations.MaxSexCountDeviation);
+ avgsex /= 4;
}
if (xxx.is_zoophile(__result))
{
- if (__result.Has(Quirk.ChitinLover)) totalsex += __result.RecordRandomizer(xxx.CountOfRapedInsects, avgsex, 90);
- else totalsex += __result.RecordRandomizer(xxx.CountOfSexWithAnimals, avgsex, 90);
+ if (__result.Has(Quirk.ChitinLover)) totalsex += (int)__result.RecordRandomizer(xxx.CountOfRapedInsects, avgsex, Configurations.MaxSexCountDeviation);
+ else totalsex += (int)__result.RecordRandomizer(xxx.CountOfSexWithAnimals, avgsex, Configurations.MaxSexCountDeviation);
avgsex /= 2;
}
else if (xxx.is_necrophiliac(__result))
{
- totalsex += __result.RecordRandomizer(xxx.CountOfSexWithCorpse, avgsex, 90);
+ totalsex += (int)__result.RecordRandomizer(xxx.CountOfSexWithCorpse, avgsex, Configurations.MaxSexCountDeviation);
avgsex /= 2;
}
if (__result.IsSlave)
{
- totalsex += __result.RecordRandomizer(xxx.CountOfBeenRapedByHumanlikes, 0, Rand.Range(0,100)*sexableage);
- totalsex += __result.RecordRandomizer(xxx.CountOfBeenRapedByAnimals, Rand.Range(-50,10), Rand.Range(0,10)*sexableage);
+ totalsex += (int)__result.RecordRandomizer(xxx.CountOfBeenRapedByAnimals, Rand.Range(-50,10), Rand.Range(0,10)*sexableage);
+ totalsex += (int)__result.RecordRandomizer(xxx.CountOfBeenRapedByHumanlikes, 0, Rand.Range(0,100)*sexableage);
}
+
- totalsex += __result.RecordRandomizer(xxx.CountOfSexWithHumanlikes, avgsex, 90);
- if (__result.relations != null)
+ totalsex += (int)__result.RecordRandomizer(xxx.CountOfSexWithHumanlikes, avgsex, Configurations.MaxSexCountDeviation);
if (__result.relations != null && __result.gender == Gender.Female)
{
- totalbirth += __result.relations.GetDirectRelationsCount(PawnRelationDefOf.Child);
+ totalbirth += __result.relations.ChildrenCount;
+ totalsex += (int)totalbirth;
+ __result.records?.AddTo(xxx.CountOfSexWithHumanlikes, totalbirth);
__result.records?.SetTo(xxx.CountOfBirthHuman, totalbirth);
}
}
diff --git a/RJWSexperience/RJWSexperience/Rituals/JobGiver_GangbangVictim.cs b/RJWSexperience/RJWSexperience/Rituals/JobGiver_GangbangVictim.cs
new file mode 100644
index 0000000..57776ae
--- /dev/null
+++ b/RJWSexperience/RJWSexperience/Rituals/JobGiver_GangbangVictim.cs
@@ -0,0 +1,133 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Verse;
+using Verse.AI;
+using Verse.AI.Group;
+using RimWorld;
+using rjw;
+
+
+namespace RJWSexperience
+{
+ public class JobGiver_GangbangVictim : ThinkNode_JobGiver
+ {
+ protected override Job TryGiveJob(Pawn pawn)
+ {
+ if (pawn.Drafted) return null;
+ DutyDef dutyDef = null;
+ PawnDuty duty = null;
+ if (pawn.mindState != null)
+ {
+ duty = pawn.mindState.duty;
+ dutyDef = duty.def;
+ }
+ else return null;
+
+ if (dutyDef == DutyDefOf.TravelOrLeave || !xxx.can_rape(pawn))
+ {
+ return null;
+ }
+
+ Pawn target = duty.focusSecond.Pawn;
+
+ if (!pawn.CanReach(target, PathEndMode.ClosestTouch, Danger.None)) return null;
+
+ return JobMaker.MakeJob(VariousDefOf.RapeVictim, target);
+ }
+ }
+
+
+ ///
+ /// copied from rjw
+ ///
+ public class JobDriver_RapeVictim : JobDriver_Rape
+ {
+ public override bool TryMakePreToilReservations(bool errorOnFailed)
+ {
+ return true;
+ }
+
+ protected override IEnumerable MakeNewToils()
+ {
+ if (RJWSettings.DebugRape) ModLog.Message("" + this.GetType().ToString() + "::MakeNewToils() called");
+ setup_ticks();
+ var PartnerJob = xxx.gettin_raped;
+
+ this.FailOnDespawnedNullOrForbidden(iTarget);
+ //this.FailOn(() => (!Partner.health.capacities.CanBeAwake) || (!comfort_prisoners.is_designated(Partner)));//this is wrong
+ this.FailOn(() => Partner == null);
+ this.FailOn(() => pawn.Drafted);
+ this.FailOn(() => Partner.Drafted);
+ yield return Toils_Goto.GotoThing(iTarget, PathEndMode.OnCell);
+
+ SexUtility.RapeTargetAlert(pawn, Partner);
+
+ Toil StartPartnerJob = new Toil();
+ StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant;
+ StartPartnerJob.socialMode = RandomSocialMode.Off;
+ StartPartnerJob.initAction = delegate
+ {
+ var dri = Partner.jobs.curDriver as JobDriver_SexBaseRecieverRaped;
+ if (dri == null)
+ {
+ Job gettin_raped = JobMaker.MakeJob(PartnerJob, pawn);
+ Building_Bed Bed = null;
+ if (Partner.GetPosture() == PawnPosture.LayingInBed)
+ Bed = Partner.CurrentBed();
+
+ Partner.jobs.StartJob(gettin_raped, JobCondition.InterruptForced, null, false, true, null);
+ if (Bed != null)
+ (Partner.jobs.curDriver as JobDriver_SexBaseRecieverRaped)?.Set_bed(Bed);
+ }
+ };
+ yield return StartPartnerJob;
+
+ Toil SexToil = new Toil();
+ SexToil.defaultCompleteMode = ToilCompleteMode.Never;
+ SexToil.defaultDuration = duration;
+ SexToil.handlingFacing = true;
+ SexToil.FailOn(() => Partner.CurJob.def != PartnerJob);
+ SexToil.initAction = delegate
+ {
+ Partner.pather.StopDead();
+ Partner.jobs.curDriver.asleep = false;
+ // Unlike normal rape try use comfort prisoner condom
+ CondomUtility.GetCondomFromRoom(Partner);
+ usedCondom = CondomUtility.TryUseCondom(Partner);
+
+ if (RJWSettings.DebugRape) ModLog.Message("JobDriver_RapeComfortPawn::MakeNewToils() - reserving prisoner");
+ //pawn.Reserve(Partner, xxx.max_rapists_per_prisoner, 0);
+ Start();
+ };
+ SexToil.tickAction = delegate
+ {
+ //if (pawn.IsHashIntervalTick(ticks_between_hearts))
+ // ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Heart);
+ SexTick(pawn, Partner);
+ SexUtility.reduce_rest(Partner, 1);
+ SexUtility.reduce_rest(pawn, 2);
+ if (ticks_left <= 0)
+ ReadyForNextToil();
+ };
+ SexToil.AddFinishAction(delegate
+ {
+ End();
+ });
+ yield return SexToil;
+
+ yield return new Toil
+ {
+ initAction = delegate
+ {
+ // Trying to add some interactions and social logs
+ SexUtility.ProcessSex(pawn, Partner, usedCondom: usedCondom, rape: isRape, sextype: sexType);
+ Partner.records.Increment(xxx.GetRapedAsComfortPawn);
+ },
+ defaultCompleteMode = ToilCompleteMode.Instant
+ };
+ }
+ }
+}
diff --git a/RJWSexperience/RJWSexperience/Rituals/RitualBehaviorWorkers.cs b/RJWSexperience/RJWSexperience/Rituals/RitualBehaviorWorkers.cs
new file mode 100644
index 0000000..ed28c9c
--- /dev/null
+++ b/RJWSexperience/RJWSexperience/Rituals/RitualBehaviorWorkers.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using RimWorld;
+using Verse;
+
+
+
+namespace RJWSexperience
+{
+ public class RitualBehaviorWorker_Gangbang : RitualBehaviorWorker
+ {
+ public RitualBehaviorWorker_Gangbang() { }
+
+ public RitualBehaviorWorker_Gangbang(RitualBehaviorDef def) : base(def) { }
+
+ public override void PostCleanup(LordJob_Ritual ritual)
+ {
+ Pawn warden = ritual.PawnWithRole("initiator");
+ Pawn pawn = ritual.PawnWithRole("victim");
+ if (pawn.IsPrisonerOfColony)
+ {
+ WorkGiver_Warden_TakeToBed.TryTakePrisonerToBed(pawn, warden);
+ pawn.guest.WaitInsteadOfEscapingFor(1250);
+
+ }
+ }
+ }
+
+ public class RitualStage_InteractWithVictim : RitualStage
+ {
+ public override TargetInfo GetSecondFocus(LordJob_Ritual ritual)
+ {
+ return ritual.assignments.AssignedPawns("victim").FirstOrDefault(p => RitualRole_RapeVictim.CanBeVictim(p));
+ }
+ }
+
+ public class RitualStage_InteractWithVictim_All : RitualStage
+ {
+ public override TargetInfo GetSecondFocus(LordJob_Ritual ritual)
+ {
+ return ritual.assignments.AssignedPawns("victim").FirstOrDefault();
+ }
+ }
+}
diff --git a/RJWSexperience/RJWSexperience/Rituals/RitualOutcomeComps.cs b/RJWSexperience/RJWSexperience/Rituals/RitualOutcomeComps.cs
new file mode 100644
index 0000000..b871a0d
--- /dev/null
+++ b/RJWSexperience/RJWSexperience/Rituals/RitualOutcomeComps.cs
@@ -0,0 +1,93 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using RimWorld;
+using Verse;
+using rjw;
+
+
+namespace RJWSexperience
+{
+ public class RitualOutcomeComp_HediffBased : RitualOutcomeComp_QualitySingleOffset
+ {
+ HediffDef hediffDef = null;
+ float minSeverity = 0;
+ string roleId = "";
+
+ protected override string LabelForDesc => label;
+ public override bool DataRequired => false;
+ public override bool Applies(LordJob_Ritual ritual)
+ {
+ Pawn victim = null;
+ foreach(RitualRole ritualRole in ritual.assignments.AllRolesForReading)
+ {
+ if (ritualRole != null && ritualRole.id.Contains(roleId))
+ {
+ victim = ritual.assignments.FirstAssignedPawn(ritualRole);
+ }
+ }
+ if (victim != null && hediffDef != null)
+ {
+ Hediff hediff = victim.health.hediffSet.GetFirstHediffOfDef(hediffDef);
+ if (hediff?.Severity >= minSeverity)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public override ExpectedOutcomeDesc GetExpectedOutcomeDesc(Precept_Ritual ritual, TargetInfo ritualTarget, RitualObligation obligation, RitualRoleAssignments assignments)
+ {
+ return new ExpectedOutcomeDesc
+ {
+ label = LabelForDesc.CapitalizeFirst(),
+ present = false,
+ uncertainOutcome = true,
+ effect = ExpectedOffsetDesc(true, -1f),
+ quality = qualityOffset,
+ positive = true
+ };
+ }
+
+ }
+
+ public class RitualOutcomeComp_NeedBased : RitualOutcomeComp_QualitySingleOffset
+ {
+ NeedDef needDef = null;
+ float minAvgNeed = 0;
+
+ protected override string LabelForDesc => label;
+ public override bool DataRequired => false;
+ public override bool Applies(LordJob_Ritual ritual)
+ {
+ float avgNeed = 0;
+ foreach (Pawn pawn in ritual.assignments.AllPawns)
+ {
+ avgNeed += pawn.needs?.TryGetNeed(needDef)?.CurLevel ?? 0f;
+ }
+ avgNeed /= ritual.assignments.AllPawns.Count;
+ if (avgNeed >= minAvgNeed) return true;
+
+ return false;
+ }
+
+ public override ExpectedOutcomeDesc GetExpectedOutcomeDesc(Precept_Ritual ritual, TargetInfo ritualTarget, RitualObligation obligation, RitualRoleAssignments assignments)
+ {
+ return new ExpectedOutcomeDesc
+ {
+ label = LabelForDesc.CapitalizeFirst(),
+ present = false,
+ uncertainOutcome = true,
+ effect = ExpectedOffsetDesc(true, -1f),
+ quality = qualityOffset,
+ positive = true
+ };
+ }
+ }
+
+
+
+}
diff --git a/RJWSexperience/RJWSexperience/Rituals/RitualRoles.cs b/RJWSexperience/RJWSexperience/Rituals/RitualRoles.cs
new file mode 100644
index 0000000..bc3daa7
--- /dev/null
+++ b/RJWSexperience/RJWSexperience/Rituals/RitualRoles.cs
@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using RimWorld;
+using Verse;
+using rjw;
+
+namespace RJWSexperience
+{
+ public class RitualRole_RapeVictim : RitualRole
+ {
+ public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false)
+ {
+ reason = null;
+ return false;
+ }
+
+ public override bool AppliesToPawn(Pawn p, out string reason, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false)
+ {
+ reason = null;
+ if (CanBeVictim(p)) return true;
+ if (!skipReason)
+ {
+ reason = "slave, prisoner, submissive gender only";
+ }
+ return false;
+ }
+
+ public static bool CanBeVictim(Pawn pawn)
+ {
+
+ if (pawn.IsPrisonerOfColony || pawn.IsSlaveOfColony) return true;
+ if (pawn.Ideo?.HasMeme(MemeDefOf.FemaleSupremacy) ?? false && pawn.gender != Gender.Female) return true;
+ else if (pawn.Ideo?.HasMeme(MemeDefOf.MaleSupremacy) ?? false && pawn.gender != Gender.Male) return true;
+
+ return false;
+ }
+ }
+
+ public class RitualRole_HumanBreedee : RitualRole
+ {
+ public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false)
+ {
+ reason = null;
+ return false;
+ }
+
+ public override bool AppliesToPawn(Pawn p, out string reason, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false)
+ {
+ reason = null;
+ if (!xxx.is_human(p))
+ {
+ reason = "not human";
+ return false;
+ }
+ if (CanBeBreedee(p)) return true;
+ if (!skipReason)
+ {
+ reason = "capable of sex is required";
+ }
+ return false;
+ }
+
+ public static bool CanBeBreedee(Pawn pawn)
+ {
+ if (xxx.can_be_fucked(pawn)) return true;
+ return false;
+ }
+ }
+
+ public class RitualRole_AnimalBreeder : RitualRole
+ {
+ public override bool Animal => true;
+
+ public override bool AppliesToRole(Precept_Role role, out string reason, Precept_Ritual ritual = null, Pawn pawn = null, bool skipReason = false)
+ {
+ reason = null;
+ return false;
+ }
+
+ public override bool AppliesToPawn(Pawn p, out string reason, LordJob_Ritual ritual = null, RitualRoleAssignments assignments = null, Precept_Ritual precept = null, bool skipReason = false)
+ {
+ reason = null;
+ if (!p.IsAnimal())
+ {
+ reason = "not animal";
+ return false;
+ }
+ if (CanBeBreeder(p, assignments?.Ritual)) return true;
+ if (!skipReason)
+ {
+ reason = "improper animal: cannot breed or forbidden by precepts";
+ }
+ return false;
+ }
+
+ public static bool CanBeBreeder(Pawn animal, Precept_Ritual precept)
+ {
+ if (precept != null)
+ {
+ if (precept.ideo.HasPrecept(VariousDefOf.Bestiality_OnlyVenerated) && !precept.ideo.IsVeneratedAnimal(animal)) return false;
+ }
+ if (!xxx.can_rape(animal)) return false;
+ return true;
+ }
+
+ }
+
+
+}
diff --git a/RJWSexperience/RJWSexperience/StatParts.cs b/RJWSexperience/RJWSexperience/StatParts.cs
index 798a107..f88b155 100644
--- a/RJWSexperience/RJWSexperience/StatParts.cs
+++ b/RJWSexperience/RJWSexperience/StatParts.cs
@@ -17,19 +17,14 @@ namespace RJWSexperience
public override string ExplanationPart(StatRequest req)
{
Pawn pawn = req.Thing as Pawn;
- return Keyed.LustStatFactor(LustFactor(pawn) * factor * 100);
+ return Keyed.LustStatFactor(String.Format("{0:0.##}", pawn.LustFactor() * factor * 100));
}
public override void TransformValue(StatRequest req, ref float val)
{
Pawn pawn = req.Thing as Pawn;
- if (pawn != null) val *= LustFactor(pawn) * factor;
- }
-
- protected float LustFactor(Pawn pawn)
- {
- return 1 + pawn.records.GetValue(VariousDefOf.Lust) / 100;
+ if (pawn != null) val *= pawn.LustFactor() * factor;
}
}
@@ -59,7 +54,7 @@ namespace RJWSexperience
break;
}
}
- return Keyed.MemeStatFactor(fact * 100);
+ return Keyed.MemeStatFactor(String.Format("{0:0.##}", fact * 100));
}
public override void TransformValue(StatRequest req, ref float val)
@@ -96,7 +91,7 @@ namespace RJWSexperience
{
if (pawn.IsSlave)
{
- return Keyed.SlaveStatFactor(fact);
+ return Keyed.SlaveStatFactor(String.Format("{0:0.##}", fact));
}
}
return Keyed.SlaveStatFactorDefault;
diff --git a/RJWSexperience/RJWSexperience/Utility.cs b/RJWSexperience/RJWSexperience/Utility.cs
index 8350f57..22aeab3 100644
--- a/RJWSexperience/RJWSexperience/Utility.cs
+++ b/RJWSexperience/RJWSexperience/Utility.cs
@@ -58,7 +58,28 @@ namespace RJWSexperience
return value;
}
+ public static bool ContainAll(this string str, string[] tags)
+ {
+ string lstr = str.ToLower();
+ if (!tags.NullOrEmpty()) for (int i=0; i< tags.Count(); i++)
+ {
+ if (!lstr.Contains('[' + tags[i].ToLower() + ']')) return false;
+ }
+ return true;
+ }
+ public static float LustFactor(this Pawn pawn)
+ {
+ float lust = pawn.records.GetValue(VariousDefOf.Lust) * Configurations.LustEffectPower;
+ if (lust < 0)
+ {
+ lust = (float)Math.Exp((lust + 200 * Math.Log(10)) / 100) - 100f;
+ }
+
+
+ return 1 + lust / 100;
+ }
+
}
}
diff --git a/RJWSexperience/RJWSexperience/VariousDefOf.cs b/RJWSexperience/RJWSexperience/VariousDefOf.cs
index c0a19e7..d6c341f 100644
--- a/RJWSexperience/RJWSexperience/VariousDefOf.cs
+++ b/RJWSexperience/RJWSexperience/VariousDefOf.cs
@@ -14,6 +14,7 @@ namespace RJWSexperience
public static readonly RecordDef Lust = DefDatabase.GetNamed("Lust");
public static readonly SkillDef SexSkill = DefDatabase.GetNamed("Sex");
public static readonly ThoughtDef_Recordbased AteCum = DefDatabase.GetNamed("AteCum");
+ public static readonly JobDef RapeVictim = DefDatabase.GetNamed("RapeVictim");
[MayRequireIdeology] public static readonly MemeDef Zoophile = DefDatabase.GetNamed("Zoophile");
[MayRequireIdeology] public static readonly MemeDef Rapist = DefDatabase.GetNamed("Rapist");
diff --git a/Textures/UI/Issues/Gangbang.png b/Textures/UI/Issues/Gangbang.png
new file mode 100644
index 0000000..d7b27cf
Binary files /dev/null and b/Textures/UI/Issues/Gangbang.png differ
diff --git a/Textures/UI/Issues/Submissive.png b/Textures/UI/Issues/Submissive.png
new file mode 100644
index 0000000..ba8917a
Binary files /dev/null and b/Textures/UI/Issues/Submissive.png differ
diff --git a/changelogs.txt b/changelogs.txt
index 66c50d8..f4e6afd 100644
--- a/changelogs.txt
+++ b/changelogs.txt
@@ -1,3 +1,11 @@
+Version Beta 1.0.1.6
+ - changed stat calculation of lust
+ - on negative lust, use exponential function instead of linear
+ - added gangbang rituals
+ - chance of bestiality with non-venerated animal on only venerated precept reduced greatly
+ - added submissive precepts
+ - added mod settings
+
Version Beta 1.0.1.5
- changed icon for precepts and memes
- added stat factors to precepts