From fa07b9365c532962b226ad6dc08c2636f9e20e77 Mon Sep 17 00:00:00 2001 From: Vegapnk Date: Mon, 14 Nov 2022 17:47:43 +0100 Subject: [PATCH] Drafts for more extra-genitalia --- Common/Assemblies/Rjw-Genes.dll | Bin 12288 -> 16384 bytes .../GeneDefs_ExtraGenitaliaEndogenes.xml | 89 +++++++++++++++--- Source/GeneDefOf.cs | 6 ++ Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs | 59 ++++++++++++ .../Genes/ExtraGenitalia/Gene_ExtraBreasts.cs | 61 ++++++++++++ .../Genes/ExtraGenitalia/Gene_ExtraPenis.cs | 2 +- .../Genes/ExtraGenitalia/Gene_ExtraVagina.cs | 66 +++++++++++++ Source/Genes/ExtraGenitalia/Gene_NoAnus.cs | 57 +++++++++++ Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs | 59 ++++++++++++ Source/Genes/ExtraGenitalia/Gene_NoPenis.cs | 1 + Source/Genes/ExtraGenitalia/Gene_NoVagina.cs | 59 ++++++++++++ Source/Genes/Genitalia/GenitaliaChanger.cs | 4 +- Source/GenitaliaUtility.cs | 83 +++++++++++----- Source/Rjw-Genes.csproj | 6 ++ 14 files changed, 514 insertions(+), 38 deletions(-) create mode 100644 Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs create mode 100644 Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs create mode 100644 Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs create mode 100644 Source/Genes/ExtraGenitalia/Gene_NoAnus.cs create mode 100644 Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs create mode 100644 Source/Genes/ExtraGenitalia/Gene_NoVagina.cs diff --git a/Common/Assemblies/Rjw-Genes.dll b/Common/Assemblies/Rjw-Genes.dll index 6446c8d443580c16520e67dae76cff39ed444014..f5555d1fba51fd20efcb38352a711827a77fe852 100644 GIT binary patch literal 16384 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 z≫HJ(Y4vl{T2_*pqcdic!OF@N8q~xa>l*WoxE9)HrU!WYa@c5M5C>ZZ77A%EjF1 zxR{YjS-ilFw5P}ogv*zC^H@d0GFgviIbLhr!Gca(!@MV{f6~dD$?KK?-j)~k}<0g~3IbCHP-qDmYkMdm9g`5Kl$FAa(SU7aoHVyOvg0`` zZOR}v2&wiw-lz>vfVFGFD#1F<;fc{vHnJ#z&Ic^VDx5SM`uAHgjAwBxcv~f~e&V1dyHWKPcemDvKC zqgi{BajZ7NQdI)Pi_vYWVO@k%KC5=PzF>LvnMMllTnWE626T6V>q^p{4B;E2qh?CI zprt+8QCVwPSc@hQ=`7!Fsq@05m8e^uB#z(i)Zs)C|)`(@K$vlanp%Z3s zE<&zAeIJqf<&pYsJkcyxCR6FOYnABVheTpqsg#+acG;>0lg*><=HdD&sa3nx#n8>jSDbt3<@=+LH)koW%M4lp>*btc!Y~zsvVYkH1BPqj>fSB)U z8`^EAa|*>!E;5kalRW`qzvmc>=esf!t8Q zCU4r=T)$}_w?@o)Y_-2kyTDg@1#^oN3dG&)=ulxk`S76D9|s2_@WvdHG9($1MoOxX zqLddQMU!4VS%nlcy(&RDtShHbffVKyAcd*=quOryQHWc86yg>ig_P7DMQ}@xi|~nI zNVSXRpztUX>W*rR8ID($9qb?+*sP3GNZ>f0W$kezkHoFE72;xMI2}5&__2I!2b(W@ zlS-wf(R1qul}F2?y7BVRZpUjCja9K5R;NFi9Mr!d54YWV?%`fMJzPc9!%BkXk%|K$ zDjt!;;kAnkfeT;RX+#L+jtR;2O4`UU+^sl_^2cD}DApJ|BZ%jTAf6k7C?6EPc+wDD zoh+nT90869g}sml<`U-z)!sLJBifYB4e{X|i7)S_mp;>(Nasl%S^A2pk7R|E5?E&` z&S!~KyFH4{oXM*NF@Zxl+Pn`{e)ojWgIW*F~uvcN3@G5<-u`aJb%da`1`Ggpn)u#?0H$Y(Oqgw62n_40;bi7tg=Ns|DAZ`(JtL z`)v=je>3#c8)s%`UMGKC)55+uX#q6q>KLtMp!*3eUobWuKqEHo57y1z=?}(cKhA=& z!?huQ%!rvWYjNGUR(A~FGXR;6k}q}`^y!!xTBvC&DR$T&)nZmKu0w~;imQXF$HKTD zYGS6sVzc*$Lz-&)Lts>qwm3F>ibbY_i(`{$1fb-ir6HFbjcbdD8H)&38cRZfSla6W zqh@d6uDL2$p@aM&Y+*|dN8%(*e1+-?`Qv!=1t;~`;V`k8vDq&pAb5eU)y9l2S|IQeA5VZ2n|%@-j>pqgEp z3w(;DgK%NLKcv@20;KD;wZ4#s7xB6tn|57NAsDP%sOjv^DY(PFE2jq0GZMz2KAy>N z_|I=XbYR)0=Wc`2YjGdOeJJDx5$z+mQ@F=)o4C`s^DckThqqts5yD{bA5ZLlOaVTO z*nSDqG?qrB7Rvw;6F3;w*EzM*9UzO}eiqqV8aQyW@`HyO>XDdY0yO|7Z6=3#J~ zM>e;O7;Q(5%QhHDWz`ymTJfU`{1J6)v^?3U!#`KR}P;uLkLBWri2(|d93A$bHhO*!E+_pNo%v9P@N z|7DE7!N+eKh-S;ZP``@7oXn%M+-}_09U;01YtOqb^6{4~2k?%02(Sy^^7m6WzWMI~ z-VL}@{jW>2(DwlP z+UQ;Mt(B6H@opZg7V;b&bq2}6mUM|l^T$Zye3Ql>&ua{Q_h5`s>BS!B@INWp(ovi+ zP`4xs<+M26k4+J$4X}f6l3${f>QOVJYB|s0O@-*;cU5BVK6ebB8MfD(8^$=|g!ROy zqte(E?cOBu?S+mke3?LO^Cccv>Pxgq;#%HkZgl6ywoUr9!+Hlcjmzn75}u#0AI$&X UbM>mR+h|3%=x0SjQ|x&QzG literal 12288 zcmeHNe{dXkb$`2e+B@CZ7wcrpPL$f`U&;9-UF6@2e?~v9Qug6bD6fsb{+R`=(M2bv6;b z(nzET_4fx!8=CoeJy9s}V>P}UPxbr?z&H$R&0!B|DAUicM04fVh}#DGzgEQANb_2^m-E+^Nz0@3<_gF)YRfG|7fRH(`sfac8M>~6 z*Mok8*Zw24XRd**jV&v0n2DhAriQLGXEhibXPINIK{KQ^uTr&X?zN&%&5D7SSgpp_ z^7Hr1!%`UIJcO>0hj}vhmx5<%b3=tA>Uk!)-VkxVrVulxc`0VBFfEShq?JaAlMq%l z*T(YrI-t{R!?hGg3Y(S$n^y&0fd&ifI242wk+l)cMSTaNJ~#2TUgE!hHIriI2H2Xx z(g@AK!%!T(Xo>e!YF3rFI@_DrEMgALU`kfCT}|TZY&WynmMht=CUJGPv6@3OH(kkg zHHoXUjkz6~+00-IK(%~VlejwDTiNV32HW4pb~TBsv%Q1O?qu+GV_8k&>TI{M*_#>c z0x0KXZd;nECV`dE*y^X>V5MNIu5*x7Eu^W_%YbX=8OC{Y2?yfXp__I+0=a;-2b864 zGiW==zgF+B^J~-CJMoPA;(NiJ#*PZ?JU`-C9onvbNQ2-?$-}kID|oujm1gGh=_tb` zCFOnKHzzzzpZ65iQk#|CmCu?by;~~vn99blLJ!-5*4*vMSE|KtUEpa=CAZXGiOFt zbp8;4)eB(jFmLs-;`bNvPM3Hsjf;5L(LKGDTyb!i31M?PV1g8kf=YEXWVoSo4MNO(UaM1^eZCeYp~iX2hJ319Zm=?tC$2K}L3Ppi zsZ!Jf+QPC@k9c=MFCg)9Rzq4G8?hD+#PIrKp-r+;Q=wd|lqkbZ=QaCq8SQV% zYW6*4w7cn~W`DMf?rZAP?4Os>?M=66_Kj-ERC80S>`jRo-u)6YTo)2ETzL{RnDBsH z;Sy3q6Em&S=DiH_hR;PO;8~FK*rGNhFe<}fwM5YX1EY_|JJ4uSR-)XOXVy#uMqExy zIPGC!p=Zsx6LK48nG^S6Oq*d(Yj{(UepG@(R4en~#@KTYU4J3e5N=wo2CR2NOVeZb zDWseT1y4yaZNv@Ne{iKK%HsLf&-`4g*sao)^uma8F5ZucBGw=H?cKi)B|806GN ztnyakv3Rdpcu-6_s9M@A2bDPCt5_~ZDcysigY*E(3ziJ6?>^dtZHGP%ybZZqzdvh@ zurMx&D#ur-!CKg&H3aFf8V2;~$0qgsgW z3%udeC>Q!6+TW^q*cYOA`57wO8-TCWFnrC&uoV=I{)|{MBU;P-?A1qv@=K9?6p|78 z_fS(fMExT3*Od2Nq&@H!mSG`6$sltd2RB4N5cpfbkJ1I?EP^8|b6*tti7?AV05y69 zb~I7~Khz?0Eo3x$!N;CF8)BKm;_bIM|vIl z;%t9`0Y*Wg3rPF(!5>hUhb^P$YMu`=rs7^kk=o~j!}vYtV&4ohwiIK?ygL=fBH%Li zMGw11u)K#w1-r+?RtWY@4_hVJ4i9S->?0nwTCgWPY%RQ9M$ZJ;vj}YvUQgJ?;xe7S z0tx1|kZR^Vd- zHwt`C;4K1A2yCon`Nsf#w7K>tfU|%*=yUW7rGajtUnv@;0&6gXZ$wfx`X}utpnOK) zI#k|;6MKugsA7@VU^t9paWRfX;p?923do(=SXhdm(JGamLt4fB2_*hP8+a};`< zE_%&+GlHZ*t*|_2Dd*AEv+}_V!LGrYUs~B?C-Q7X39Sc=8k57zA4!KbaP;X8bGCGz56L1Xi|gpyoY_q zw^a?%vV_a~sj^EA&$F_GCWUt&&1$!*OXx|#+*!ADp5#(`MtB$TW~NJ>&x_2HjL?@n z$qZ(Cgw{53@2<^-k}bl!NNebJm8*k-^}+Sz;Sj$S_yC}vE(0o3AWD#BN|NvQar?gn zy7a8b??g>gXlJ;Vx`PVNd%Oa!1q{(9K;8iu-Yl?PV2{8f0*3|afGfz9_8Eaw0xtlf zE(v^4;MWA!DNp&Xqsy{NFUv~5Rym4k|2lmtunBaY`Im`T*z5F&wv#p~E3^)3SHj9L z;4ed`P%XQI4qZ<_4qX5@q1_94?yE;xqkW8yC|2Na>8Ese;Az0m)O;RVy|vE)27C-V zLJThnWuH(s31wI)%Y`y3?RCv;9c%?F>{0w=xpcF%m$|WV_ z-=I8*c2fBm;CAIvr6Igec^aAQP@bkb?Kyf@`G)VX@`7?hZ~*Y@wa1kANlsp;e+`<- z*OZ-FPH7e&wuujyq4i!!KBOH}F4NDnmC82h_XTBd_+fbU<=V&C!w|y;z&(=lmz0~s zpMw^Kz6JOp?LU;Y^nPmfB`Hit)Fjo@3BX300$fjj4A?}M0JjR)1{rJi)dev_QwQ1EAYDl6@@)nE3jRlF3_jm2l{$} z9Rkw=FA7Z35PgVVpm!+uDj!uIQNDplvv}Y3YnoJMl}{`FSy@+Db*1ZbIIs9i2%fJh zX{;-j^3z9S{8N&zi&%XNuPs=bI5ta<_OPt8k}+p#zeBi z%4RX2Fh89nkDqO(G2g_wA*(%;p?=FL@N>YNI1cR$?YA;h{kmNkFkmf1y@un!f066e zPaD+3YuIvl@leJX?b9a=Otyk7!~>Siop28ZxpD>_Gi=8oM3*r$ST!_c>p3UOtqyA< zZ)OeAu|deR7w|)LqzG1b(X7BajgjKm7C^-R>4S*&siyJ*gB@8Zl9iG4e2&k>H&N`G|pL-jFQd)_|Cy0xpP`2W`~s8}sHeQuAk=Jumb2bQC(G+W|vk zmOaHd<_=-vxdOyf%WJybdI;~8Y}(;fjEwtU zgAQ3^GS@J%T*^V+8JBJMkdYfJj8j)G;~Y297&r7R9z9OGT`)(@w5eywm_*mG2{(96 zlWm}crDfwUkp}KM*CJjfGuf=?mDoRw)o+`bjFF>uS%qbnjZtr1a$@FIDW}AGVm`Ncf@lrd~x$NVVw?-m~08&w`No7fQ!%MGwqbq z>rU=uPp)9tR({a1&zfmt5!+pGhF#{n8w~~uXVxdL+)5uf30J(b5qb1=>LoRjgeQWB#+4h_ol?DXu%vMGF>_9NN5?_O zvM2Ncc5-)}AumRb_eV!o1E!DdU^QB&-M!Tzwl{)|IR%Fo9S%W~R#d4JpNPuUQxG?5 zX}bPOlTAnio}kjX?ZYE?p-omk#fLPk+l`YKE*YJml<8l=F4C z%|naMBC0%ka`41bLeEvTH&)ZmK|Td-9&wZB2c3HT-7oJxefR#4*R7fU&A+|=dGf~; zCFqNhQiDca9itHjs-MvEY0>E#G@{dft#0;GFrcic)0H~IuSIA7LUY^8VtyrhGFo)8 z=s` zwHG2Ebk9Vmqs727MOjVJlm3trozh?>I<2y+OW@_1hCog9V5uwU&fdd)9tuN81^F^G zS?^?RjD%TF0Z+&u!>?rosYXu*iH$~QKZS(g6`oQz`)qXfxmr@|W?zf|K~Q+S2u^hN zYv6DiUJ8?6i3t9Zs%jCaast)J(tywHVK_P*J<6j0$(>6!hQ09d6izt!NP8GR`LbY>sooeJY#Y%;u zymw4L*-u)&E6SxFTTsQ!Oh6>GRu26!gVIfIPll)9H3^}SY_pObv!Jqm5z%KrpM1)U{v-2Hu zziuMAi|8zO5ceIYh_08nS4`pdHo#+eFP8%Bq5-se@Ryc-zxPNs?pY{Luo9=rt zFWHz#eBrN6Dvh8&h zyu9>3g=lq=bNeRRgRhiIxxY?Wa8S9~kNiA82c(Kuo+JqUV?!$I9)qq8?YY=CZx|}^8TlV*`*9VUb`&$|t#yI1I`NSuj%G}KPy-o7l z4;vO@DI&LpiioS}623xmUgzs9% rjw_genes_genitalia - - + rjw_genes_extra_penis Males of this species grow an additional penis . Genes/Icons/Placeholder RJW_Genes.Gene_ExtraPenis - 15 + 20
  • PenisAmount
  • - rjw_genes_no_penis Males of this do not have a penis. Genes/Icons/Placeholder RJW_Genes.Gene_NoPenis - 16 + 21
  • PenisAmount
  • + + + rjw_genes_extra_vagina + + Females of this species grow an additional vagina . + Genes/Icons/Placeholder + RJW_Genes.Gene_ExtraVagina + 22 + +
  • VaginaAmount
  • +
    +
    + + + rjw_genes_no_vagina + + Females of this do not have a vagina. + Genes/Icons/Placeholder + RJW_Genes.Gene_NoVagina + 23 + +
  • VaginaAmount
  • +
    +
    + + + + rjw_genes_extra_breasts + + Females of this species grow an additional pair of breasts . + Genes/Icons/Placeholder + RJW_Genes.Gene_ExtraBreasts + 24 + +
  • BreastAmount
  • +
    +
    + + + rjw_genes_no_breasts + + Females of this do not have a pair of breasts. + Genes/Icons/Placeholder + RJW_Genes.Gene_NoBreasts + 25 + +
  • BreastAmount
  • +
    +
    + + + rjw_genes_extra_anus + + This specias has an extra anus. + Genes/Icons/Placeholder + RJW_Genes.Gene_ExtraAnus + 26 + +
  • AnusAmount
  • +
    +
    + + + rjw_genes_no_anus + + This specias has no anus. + Genes/Icons/Placeholder + RJW_Genes.Gene_NoAnus + 27 + +
  • AnusAmount
  • +
    +
    + + \ No newline at end of file diff --git a/Source/GeneDefOf.cs b/Source/GeneDefOf.cs index caa43fa..f83db00 100644 --- a/Source/GeneDefOf.cs +++ b/Source/GeneDefOf.cs @@ -21,5 +21,11 @@ namespace RJW_Genes // Extra Genitalia [MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_penis; [MayRequireBiotech] public static readonly GeneDef rjw_genes_no_penis; + [MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_vagina; + [MayRequireBiotech] public static readonly GeneDef rjw_genes_no_vagina; + [MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_breasts; + [MayRequireBiotech] public static readonly GeneDef rjw_genes_no_breasts; + [MayRequireBiotech] public static readonly GeneDef rjw_genes_extra_anus; + [MayRequireBiotech] public static readonly GeneDef rjw_genes_no_anus; } } diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs new file mode 100644 index 0000000..7bb5953 --- /dev/null +++ b/Source/Genes/ExtraGenitalia/Gene_ExtraAnus.cs @@ -0,0 +1,59 @@ +using Verse; +using rjw; +using RimWorld; + +namespace RJW_Genes +{ + public class Gene_ExtraAnus : Gene + { + + internal Hediff additional_anus; + + public override void PostMake() + { + base.PostMake(); + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + + if (additional_anus == null) + { + CreateAndAddAnus(); + } + } + + public override void PostAdd() + { + base.PostAdd(); + + if (additional_anus == null) + { + CreateAndAddAnus(); + } + } + + public override void PostRemove() + { + base.PostRemove(); + if(additional_anus != null) + pawn.health.RemoveHediff(additional_anus); + } + + internal void CreateAndAddAnus() + { + var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn); + var anusDef = GenitaliaUtility.GetAnusForGene(correctGene); + var partBPR = Genital_Helper.get_anusBPR(pawn); + additional_anus = HediffMaker.MakeHediff(anusDef, pawn); + + var CompHediff = additional_anus.TryGetComp(); + if (CompHediff != null) + { + CompHediff.initComp(pawn); + CompHediff.updatesize(); + } + + pawn.health.AddHediff(additional_anus, partBPR); + } + + } +} diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs new file mode 100644 index 0000000..e8e658f --- /dev/null +++ b/Source/Genes/ExtraGenitalia/Gene_ExtraBreasts.cs @@ -0,0 +1,61 @@ +using Verse; +using rjw; +using RimWorld; + +namespace RJW_Genes +{ + public class Gene_ExtraBreasts : Gene + { + + internal Hediff additional_breasts; + + public override void PostMake() + { + base.PostMake(); + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + + // Penis are only added for female pawns! + if (pawn.gender == Gender.Female && additional_breasts == null) + { + createAndAddPenis(); + } + } + + public override void PostAdd() + { + base.PostAdd(); + + // Penis are only added for female pawns! + if (pawn.gender == Gender.Female && additional_breasts == null) + { + createAndAddPenis(); + } + } + + public override void PostRemove() + { + base.PostRemove(); + if(additional_breasts != null) + pawn.health.RemoveHediff(additional_breasts); + } + + internal void createAndAddPenis() + { + var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn); + var breastDef = GenitaliaUtility.GetBreastsForGene(correctGene); + var partBPR = Genital_Helper.get_breastsBPR(pawn); + additional_breasts = HediffMaker.MakeHediff(breastDef, pawn); + + var CompHediff = additional_breasts.TryGetComp(); + if (CompHediff != null) + { + CompHediff.initComp(pawn); + CompHediff.updatesize(); + } + + pawn.health.AddHediff(additional_breasts, partBPR); + } + + } +} diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs index b01e626..10dfb57 100644 --- a/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs +++ b/Source/Genes/ExtraGenitalia/Gene_ExtraPenis.cs @@ -43,7 +43,7 @@ namespace RJW_Genes internal void createAndAddPenis() { var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn); - var penisDef = GenitaliaUtility.GetPenisForGene(correctGene); + HediffDef penisDef = GenitaliaUtility.GetPenisForGene(correctGene); var partBPR = Genital_Helper.get_genitalsBPR(pawn); additional_penis = HediffMaker.MakeHediff(penisDef, pawn); diff --git a/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs b/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs new file mode 100644 index 0000000..a6f6bff --- /dev/null +++ b/Source/Genes/ExtraGenitalia/Gene_ExtraVagina.cs @@ -0,0 +1,66 @@ +using Verse; +using rjw; +using RimWorld; + +namespace RJW_Genes +{ + public class Gene_ExtraVagina : Gene + { + + internal Hediff additional_vagina; + + //TODO: This works ingame when genes are added, but if there is + //a gene (e.g. ovipositor) in creation it does not work as expected (only has one genital) + //Penis works as expected + + + public override void PostMake() + { + base.PostMake(); + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + + // Vaginas are only added for female pawns! + if (pawn.gender == Gender.Female && additional_vagina == null) + { + CreateAndAddVagina(); + } + } + + public override void PostAdd() + { + base.PostAdd(); + + // Vaginas are only added for female pawns! + if (pawn.gender == Gender.Female && additional_vagina == null) + { + CreateAndAddVagina(); + } + } + + public override void PostRemove() + { + base.PostRemove(); + if(additional_vagina != null) + pawn.health.RemoveHediff(additional_vagina); + } + + internal void CreateAndAddVagina() + { + var correctGene = GenitaliaUtility.GetGenitaliaTypeGeneForPawn(pawn); + HediffDef vaginaDef = GenitaliaUtility.GetVaginaForGene(correctGene); + var partBPR = Genital_Helper.get_genitalsBPR(pawn); + additional_vagina = HediffMaker.MakeHediff(vaginaDef, pawn); + + var CompHediff = additional_vagina.TryGetComp(); + if (CompHediff != null) + { + CompHediff.initComp(pawn); + CompHediff.updatesize(); + } + + pawn.health.AddHediff(additional_vagina, partBPR); + } + + } +} diff --git a/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs b/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs new file mode 100644 index 0000000..28ea3ba --- /dev/null +++ b/Source/Genes/ExtraGenitalia/Gene_NoAnus.cs @@ -0,0 +1,57 @@ +using Verse; +using rjw; +using RimWorld; + +namespace RJW_Genes +{ + public class Gene_NoAnus : Gene + { + + internal Hediff removed_anus; + + // TODO: This gene only works if another Gene was set specifying the genitalia. + // If it is added later, it still works, but on creation it needs a different + // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn + public override void PostMake() + { + base.PostMake(); + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + + if (removed_anus == null) + { + RemoveButStoreAnus(); + } + } + + public override void PostAdd() + { + base.PostAdd(); + + if (removed_anus == null) + { + RemoveButStoreAnus(); + } + } + + public override void PostRemove() + { + base.PostRemove(); + if(removed_anus != null) + pawn.health.AddHediff(removed_anus); + } + + internal void RemoveButStoreAnus() + { + var partBPR = Genital_Helper.get_anusBPR(pawn); + Hediff anusToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => GenitaliaChanger.IsAnus(x)); + + if(anusToRemove != null) + { + removed_anus = anusToRemove; + pawn.health.RemoveHediff(anusToRemove); + } + } + + } +} diff --git a/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs b/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs new file mode 100644 index 0000000..bf1cd40 --- /dev/null +++ b/Source/Genes/ExtraGenitalia/Gene_NoBreasts.cs @@ -0,0 +1,59 @@ +using Verse; +using rjw; +using RimWorld; + +namespace RJW_Genes +{ + public class Gene_NoBreasts : Gene + { + + internal Hediff removed_breasts; + + // TODO: This gene only works if another Gene was set specifying the genitalia. + // If it is added later, it still works, but on creation it needs a different + // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn. IDEA: Add male-nipples ? + public override void PostMake() + { + base.PostMake(); + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + + // Breasts are removed for female pawns! + if (pawn.gender == Gender.Female && removed_breasts == null) + { + RemoveButStoreBreasts(); + } + } + + public override void PostAdd() + { + base.PostAdd(); + + // Breasts are removed for female pawns! + if (pawn.gender == Gender.Female && removed_breasts == null) + { + RemoveButStoreBreasts(); + } + } + + public override void PostRemove() + { + base.PostRemove(); + if(removed_breasts != null) + pawn.health.AddHediff(removed_breasts); + } + + internal void RemoveButStoreBreasts() + { + var partBPR = Genital_Helper.get_breastsBPR(pawn); + Hediff breastsToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => GenitaliaUtility.IsBreasts(x)); + + if(breastsToRemove != null) + { + removed_breasts = breastsToRemove; + pawn.health.RemoveHediff(breastsToRemove); + } + } + + } +} diff --git a/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs b/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs index 8c88452..cd7f01f 100644 --- a/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs +++ b/Source/Genes/ExtraGenitalia/Gene_NoPenis.cs @@ -11,6 +11,7 @@ namespace RJW_Genes // TODO: This gene only works if another Gene was set specifying the genitalia. // If it is added later, it still works, but on creation it needs a different + // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn public override void PostMake() { base.PostMake(); diff --git a/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs b/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs new file mode 100644 index 0000000..920c263 --- /dev/null +++ b/Source/Genes/ExtraGenitalia/Gene_NoVagina.cs @@ -0,0 +1,59 @@ +using Verse; +using rjw; +using RimWorld; + +namespace RJW_Genes +{ + public class Gene_NoVagina : Gene + { + + internal Hediff removed_vagina; + + // TODO: This gene only works if another Gene was set specifying the genitalia. + // If it is added later, it still works, but on creation it needs a different + // TODO: If all Genitalia are removed by genes, RJW adds some to the pawns at spawn + public override void PostMake() + { + base.PostMake(); + if (GenitaliaUtility.PawnStillNeedsGenitalia(pawn)) + Sexualizer.sexualize_pawn(pawn); + + // Vaginas are only removed for female pawns! + if (pawn.gender == Gender.Female && removed_vagina == null) + { + RemoveButStoreVagina(); + } + } + + public override void PostAdd() + { + base.PostAdd(); + + // Vaginas are only removed for female pawns! + if (pawn.gender == Gender.Female && removed_vagina == null) + { + RemoveButStoreVagina(); + } + } + + public override void PostRemove() + { + base.PostRemove(); + if(removed_vagina != null) + pawn.health.AddHediff(removed_vagina); + } + + internal void RemoveButStoreVagina() + { + var partBPR = Genital_Helper.get_genitalsBPR(pawn); + Hediff vaginaToRemove = Genital_Helper.get_AllPartsHediffList(pawn).FindLast(x => Genital_Helper.is_vagina(x)); + + if(vaginaToRemove != null) + { + removed_vagina = vaginaToRemove; + pawn.health.RemoveHediff(vaginaToRemove); + } + } + + } +} diff --git a/Source/Genes/Genitalia/GenitaliaChanger.cs b/Source/Genes/Genitalia/GenitaliaChanger.cs index 047beab..84f4fab 100644 --- a/Source/Genes/Genitalia/GenitaliaChanger.cs +++ b/Source/Genes/Genitalia/GenitaliaChanger.cs @@ -70,11 +70,11 @@ namespace RJW_Genes } - private static bool IsAnus(Hediff candidate) + public static bool IsAnus(Hediff candidate) { return candidate.def.defName.ToLower().Contains("anus"); } - private static bool IsArtificial(Hediff candidate) + public static bool IsArtificial(Hediff candidate) { return candidate.def.defName.ToLower().Contains("bionic") || candidate.def.defName.ToLower().Contains("archo"); } diff --git a/Source/GenitaliaUtility.cs b/Source/GenitaliaUtility.cs index 97785dc..e11f06f 100644 --- a/Source/GenitaliaUtility.cs +++ b/Source/GenitaliaUtility.cs @@ -1,6 +1,7 @@ using RimWorld; using Verse; using rjw; +using System; namespace RJW_Genes { @@ -26,30 +27,6 @@ namespace RJW_Genes return GeneDefOf.rjw_genes_human_genitalia; } - /// - /// Adds a genital created from a given Def to the pawn. - /// Does not alter/touch gender. - /// - /// The pawn whom to add the genital to, - /// The type of genital to be added - public static void AddGenitalToPawn(Pawn pawn,HediffDef genitalToAdd) - { - if (pawn == null || genitalToAdd == null) - return; - - var partBPR = Genital_Helper.get_genitalsBPR(pawn); - var additionalGenital = HediffMaker.MakeHediff(genitalToAdd, pawn); - - var CompHediff = additionalGenital.TryGetComp(); - if (CompHediff != null) - { - CompHediff.initComp(pawn); - CompHediff.updatesize(); - } - - pawn.health.AddHediff(additionalGenital, partBPR); - } - public static HediffDef GetPenisForGene(GeneDef gene) { @@ -69,6 +46,59 @@ namespace RJW_Genes } + public static HediffDef GetVaginaForGene(GeneDef gene) + { + switch (gene.defName) + { + case "rjw_genes_human_genitalia": return Genital_Helper.average_vagina; + case "rjw_genes_equine_genitalia": return Genital_Helper.equine_vagina; + case "rjw_genes_canine_genitalia": return Genital_Helper.canine_vagina; + case "rjw_genes_feline_genitalia": return Genital_Helper.feline_vagina; + case "rjw_genes_demonic_genitalia": return Genital_Helper.demon_vagina; + case "rjw_genes_dragon_genitalia": return Genital_Helper.dragon_vagina; + case "rjw_genes_slime_genitalia": return Genital_Helper.slime_vagina; + case "rjw_genes_ovipositor_genitalia": return Genital_Helper.ovipositorF; + + default: return Genital_Helper.average_vagina; + } + } + + public static HediffDef GetAnusForGene(GeneDef gene) + { + switch (gene.defName) + { + //TODO: Do I want the default to be generic or average for feline,equine and canine? + case "rjw_genes_human_genitalia": return Genital_Helper.average_anus; + case "rjw_genes_equine_genitalia": return Genital_Helper.average_anus; + case "rjw_genes_canine_genitalia": return Genital_Helper.average_anus; + case "rjw_genes_feline_genitalia": return Genital_Helper.average_anus; + case "rjw_genes_demonic_genitalia": return Genital_Helper.demon_anus; + case "rjw_genes_dragon_genitalia": return Genital_Helper.average_anus; + case "rjw_genes_slime_genitalia": return Genital_Helper.slime_anus; + case "rjw_genes_ovipositor_genitalia": return Genital_Helper.insect_anus; + + default: return Genital_Helper.generic_anus; + } + } + + public static HediffDef GetBreastsForGene(GeneDef gene) + { + switch (gene.defName) + { + //TODO: Do I want the default to be generic or average? + case "rjw_genes_human_genitalia": return Genital_Helper.average_breasts; + case "rjw_genes_equine_genitalia": return Genital_Helper.average_breasts; + case "rjw_genes_canine_genitalia": return Genital_Helper.average_breasts; + case "rjw_genes_feline_genitalia": return Genital_Helper.average_breasts; + case "rjw_genes_demonic_genitalia": return Genital_Helper.average_breasts; + case "rjw_genes_dragon_genitalia": return Genital_Helper.average_breasts; + case "rjw_genes_slime_genitalia": return Genital_Helper.slime_breasts; + case "rjw_genes_ovipositor_genitalia": return Genital_Helper.average_breasts; + + default: return Genital_Helper.generic_breasts; + } + } + public static bool PawnStillNeedsGenitalia(Pawn pawn) { // There is the issue that the genes fire in a pseudo-random order @@ -89,5 +119,10 @@ namespace RJW_Genes return !pawn_has_any_genitalia; } + + public static bool IsBreasts(Hediff candidate) + { + return candidate.def.defName.ToLower().Contains("breast"); + } } } diff --git a/Source/Rjw-Genes.csproj b/Source/Rjw-Genes.csproj index b2a146b..fd6b174 100644 --- a/Source/Rjw-Genes.csproj +++ b/Source/Rjw-Genes.csproj @@ -49,6 +49,12 @@ + + + + + +