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 + + 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 + + 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 - 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 + + 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 + + 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 + + UI/Issues/Submissive + + + + + + Submissive_None + Submissive + + Just normal. + Low + 50 + 1000 + + + + Submissive_Male + Submissive + + 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 + + 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
  • +
    + +
  • + + I had to accept. But i don't feel so good. + -3 +
  • +
    +
    + + + BeenRaped_NotSubmissive + 15 + 100 + Thought_MemorySocial + 0.4 + +
  • Masochist
  • +
    + +
  • + + How dare... + -30 + -200 +
  • +
    +
    + + + Raped_Know_NotBeingSubmissive + Thought_MemorySocial + 15 + 100 + 3 + +
  • Masochist
  • +
    + +
  • + + -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 + IdeoRole_Moralist + True + true + 1 + False +
  • + +
    + + + Gangbang + RJWSexperience.RitualBehaviorWorker_Gangbang + +
  • + + 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 + +
  • + + a breedee who will be fucked by animal + victim + 1 + True + False + true +
  • +
  • + + 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 + + 0.10 +
  • +
  • + + + +
  • (1, -0.20)
  • +
  • (3, -0.05)
  • +
  • (5, 0.05)
  • +
  • (10, 0.10)
  • + + + +
  • + true + + 0.2 + an altar +
  • +
  • + + 0.2 + FeelingBroken + 0.3 + victim +
  • +
  • + + 0.2 + FeelingBroken + 0.5 + victim +
  • +
  • + + 0.4 + FeelingBroken + 0.9 + victim +
  • +
  • + + 0.2 + Sex + 0.7 +
  • +
    + +
  • + + 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 +
  • +
  • + + 0.15 + BoringGangbang + The {0} was boring. The speech was repetitive and the victim was noticeably flawed. It just didn't feel dignified. + -1 +
  • +
  • + + 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 +
  • +
  • + + 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 + + 0.10 +
  • +
  • + + + +
  • (1, -0.50)
  • +
  • (3, -0.30)
  • +
  • (5, -0.15)
  • +
  • (10, -0.10)
  • + + + +
  • + true + + 0.2 + an altar +
  • +
  • + + 0.3 + FeelingBroken + 0.3 + victim +
  • +
  • + + 0.3 + FeelingBroken + 0.5 + victim +
  • +
  • + + 0.6 + FeelingBroken + 0.9 + victim +
  • +
    + +
  • + + 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 +
  • +
  • + + 0.15 + BoringGangbang + The {0} was boring. The speech was repetitive and the victim was noticeably flawed. It just didn't feel dignified. + -1 +
  • +
  • + + 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 +
  • +
  • + + 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 + +
  • + + That gangbang was terrible. ugh. + -3 +
  • +
    +
    + + + BoringGangbang + Thought_AttendedRitual + 6 + 3 + +
  • + + That gangbang was not good. Wish I never went. + -1 +
  • +
    +
    + + + FunGangbang + Thought_AttendedRitual + 6 + 3 + +
  • + + That was a fun gangbang. It really satisfied me. + 8 +
  • +
    +
    + + + UnforgettableGangbang + Thought_AttendedRitual + 6 + 3 + +
  • + + 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