From 873f5097a08f8e093b051da125d50716848ebf29 Mon Sep 17 00:00:00 2001
From: Jimmys <jimmysilverstein@proton.me>
Date: Wed, 8 Jan 2025 21:15:39 +0000
Subject: [PATCH] Fixes

---
 game/03-JavaScript/05-renderer/00-combat.js   |  34 ++++++++++++++++++
 .../05-renderer/19-npc-canvas-helper.js       |   2 +-
 .../05-renderer/19-player-canvas-helper.js    |   2 +-
 .../05-renderer/20-canvasmodel-combat-npc.js  |   4 +--
 .../05-renderer/20-canvasmodel-combat-pc.js   |   6 ++--
 .../05-renderer/21-npc-options.js             |   5 +++
 .../classes/housekeeping-events.twee          |   2 +-
 .../penetrators/sus/rightarm-sperm.png        | Bin 264 -> 1436 bytes
 .../missionary/penetrators/sus/rightarm.png   | Bin 329 -> 1229 bytes
 types/clothing.d.ts                           |   3 +-
 10 files changed, 49 insertions(+), 9 deletions(-)

diff --git a/game/03-JavaScript/05-renderer/00-combat.js b/game/03-JavaScript/05-renderer/00-combat.js
index 21781bc3b9..2e362f4c17 100644
--- a/game/03-JavaScript/05-renderer/00-combat.js
+++ b/game/03-JavaScript/05-renderer/00-combat.js
@@ -568,6 +568,40 @@ class CombatSystem {
 		const state = wearingCondom(index);
 		return state && ["defective", "sabotaged"].includes(state);
 	}
+
+	isPcGenitalsVisible() {
+		if (!this.isPcGenitalsExposed()) {
+			return false;
+		}
+
+		if (V.lowerwetstage < 1) {
+			return false;
+		}
+
+		if (V.underlowerwetstage < 1) {
+			return false;
+		}
+
+		return true;
+	}
+
+	isPcGenitalsExposed() {
+		const lowerExposed = V.worn.lower.exposed || 0;
+		if (lowerExposed < 2) {
+			return false;
+		}
+
+		const underLowerExposed = V.worn.under_lower.exposed || 0;
+		if (underLowerExposed < 1) {
+			return false;
+		}
+
+		if (V.worn.legs.state === "waist") {
+			return false;
+		}
+
+		return true;
+	}
 }
 const combat = new CombatSystem();
 // @ts-ignore
diff --git a/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js b/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js
index bbb0029ec6..fe4da1d305 100644
--- a/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js
+++ b/game/03-JavaScript/05-renderer/19-npc-canvas-helper.js
@@ -336,7 +336,7 @@ class NpcCanvasHelper {
 				if (penetrator.position === "leftarm") {
 					return 48; // Behind the Z index of PC's "backarm"
 				}
-				return 49;
+				return 55;
 			},
 		};
 		return Object.assign(defaults, overrideOptions);
diff --git a/game/03-JavaScript/05-renderer/19-player-canvas-helper.js b/game/03-JavaScript/05-renderer/19-player-canvas-helper.js
index 68d8e9db15..1435b3175f 100644
--- a/game/03-JavaScript/05-renderer/19-player-canvas-helper.js
+++ b/game/03-JavaScript/05-renderer/19-player-canvas-helper.js
@@ -327,7 +327,7 @@ class PlayerCanvasHelper {
 			srcfn(options) {
 				const clothes = options.clothes[slot];
 				if (clothes?.name == null) return "";
-				if (layer === "front" && PlayerCanvasHelper.isBestialHandjob(options, "front")) {
+				if (layer === "front" && options.position === "doggy" && PlayerCanvasHelper.isBestialHandjob(options, "front")) {
 					return `${options.src}clothing/${slot}/${clothes.name}/sleeves/front-stroke.png`;
 				}
 				const position = layer === "front" ? options.armFrontPosition : options.armBackPosition;
diff --git a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js
index 7455d54d96..5d968f12df 100644
--- a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js
+++ b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-npc.js
@@ -76,7 +76,7 @@ const combatMainNpc = {
 				return options.animKey;
 			},
 			zfn(options) {
-				return 49;
+				return 54;
 			},
 		},
 		npcHoleEjaculate: {
@@ -91,7 +91,7 @@ const combatMainNpc = {
 				return options.animKey;
 			},
 			zfn(options) {
-				return 49;
+				return 54;
 			},
 		},
 		npcTongue: NpcCanvasHelper.genNpcTongue(),
diff --git a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js
index 7295bf8edf..1241ba173c 100644
--- a/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js
+++ b/game/03-JavaScript/05-renderer/20-canvasmodel-combat-pc.js
@@ -723,7 +723,7 @@ const combatMainPc = {
 		frontarm: {
 			srcfn(options) {
 				// Find target of hand if any, if bestial (pig) swap out sprite.
-				if (PlayerCanvasHelper.isBestialHandjob(options, "front")) {
+				if (options.position === "doggy" && PlayerCanvasHelper.isBestialHandjob(options, "front")) {
 					return `${options.src}body/arms/front-${options.armFrontPosition}-bestial.png`;
 				}
 				// Generic position.
@@ -1388,7 +1388,7 @@ const combatMainPc = {
 			srcfn(options) {
 				const clothes = options.clothes.hands;
 				if (clothes?.name == null) return "";
-				if (PlayerCanvasHelper.isBestialHandjob(options, "front")) {
+				if (options.position === "doggy" && PlayerCanvasHelper.isBestialHandjob(options, "front")) {
 					return `${options.src}clothing/hands/${clothes.name}/front-handjob-bestial.png`;
 				}
 				return `${options.src}clothing/hands/${clothes.name}/front-${options.armFrontPosition}.png`;
@@ -1416,7 +1416,7 @@ const combatMainPc = {
 			srcfn(options) {
 				const clothes = options.clothes.hands;
 				if (clothes?.name == null) return "";
-				if (PlayerCanvasHelper.isBestialHandjob(options, "front")) {
+				if (options.position === "doggy" && PlayerCanvasHelper.isBestialHandjob(options, "front")) {
 					return `${options.src}clothing/hands/${clothes.name}/front-handjob-bestial-acc.png`;
 				}
 				const path = `${options.src}clothing/hands/${clothes.name}/front-${options.armFrontPosition}-acc.png`;
diff --git a/game/03-JavaScript/05-renderer/21-npc-options.js b/game/03-JavaScript/05-renderer/21-npc-options.js
index eb8edb2a92..bd7c6763eb 100644
--- a/game/03-JavaScript/05-renderer/21-npc-options.js
+++ b/game/03-JavaScript/05-renderer/21-npc-options.js
@@ -226,6 +226,11 @@ class NpcCombatMapper {
 				"penisentrance",
 				"penisimminent",
 			].includes(npc.mouth);
+
+		if (typeof npc.mouth === "string" && ["penis", "penisentrance", "penisimminent"].includes(npc.mouth) && !combat.isPcGenitalsExposed()) {
+			options.tongue.show = false;
+		}
+
 		options.tongue.position = typeof npc.mouth === "string" ? npc.mouth : null;
 		options.penetrators = options.penetrators = [];
 
diff --git a/game/overworld-town/loc-school/classes/housekeeping-events.twee b/game/overworld-town/loc-school/classes/housekeeping-events.twee
index d3b9f6873f..72fc5474c1 100644
--- a/game/overworld-town/loc-school/classes/housekeeping-events.twee
+++ b/game/overworld-town/loc-school/classes/housekeeping-events.twee
@@ -790,7 +790,7 @@ You hear traffic. The door opens a few moments later, and you shield your eyes f
 Your eyes adjust, and you see a <<fullGroup>> grinning down at you. Their arms reach in, and drag you into the waiting alley.
 <br><br>
 
-<<link [[Next|Housekeeping Bin Rape]]>><<set $rapestart to 1>><</link>>
+<<link [[Next|Housekeeping Bin Rape]]>><<set $molestationstart to 1>><</link>>
 <br>
 
 :: Housekeeping Bin Rape
diff --git a/img/sex/missionary/penetrators/sus/rightarm-sperm.png b/img/sex/missionary/penetrators/sus/rightarm-sperm.png
index 5442e57dfcc689815a8d836b4248ce9a595349d9..174dfacffb71759ee31ca865571598805e19507b 100644
GIT binary patch
delta 1255
zcmV<D1Q`2>0-Otw8Gi-<004bg(F*_o1KoO5SaechcOY<bZ)Rz1Wgv8UaAhE6cxh$;
z0C?K1mT7V%DGWycbBZ|v+CUr!5JdD1`uOvawRo#`gl9U5EU*%U(36DI`u%ICfAA1j
zO={IkD<$L6rj0uWp5LBz?_19Mj1@24W%Qgy>BEP|h|u22^?&h|ArbU)`}4V<97Xa@
zQF-?CN>27kF3;`xgGFARJM(*aS#L%?O}W2&hi{xYo!Q#8z(3`FsK*hn5he~CPOfDI
zt>QI|>(v^X=bmRG&5>swXp<T-N#3Ls)M?YY`biTeDle|+nJ3F7bE({TN){4LqN239
zN|O*5mdQ&5Qh$EhLf5|S+HR6#;~>mrf-=I2tEI=_|F)Nk_MXQ@beyR-U%@WsgMp40
z<@{pS`M4i(WS4^<?ehb$P@<T1-0V1D&*P?I7`?@oqzklQqM^S*rW$tzFbI1aj3EJm
zTu6)x<;q-%;713a4$E1R@&E!d<A9Z{A_Z`q&)!&5>3^Eb#y2ri2p~*~RG?|n!AjM%
zB(3U*p>ASoX2q(xHS0x+7AvLHa&oa(sama;TC3MqyNj!v7q9N#yr;%ZkgL{8tIb<$
zy<^i3%^j<|cL)X#89Ho~QHPH<`b79loi@v?(`TDK1&4%&MTr_7E&8H`P+Gcdl~tFo
zw)#e>ZGYLiZI@lQ@3#As+C?>eVD^>V_tfZ44ZzaHOfl&}4dPlKD(I9GJIp|gl|Z~6
z0tje6%(9azA9Cq1%Z-s0#<0>3oS;Jt1a%SHrYE~Ma$mS5<o$o;#_!3cgYIvTO9$Nx
za$mW<pcbdT&y$B4h3%x_acUN%A0{mC?3lqn>wnWv7yL+3(AaT`Uynk=eVC$x28d*~
z5)q@$+UCl_qjwyF%1WM>_$6CaItoy~G=A(`iH=~3K)oEb0SJZZ2A~nU30!8WBCt?4
zK)N^zGH`9UxFHt$G}7g<i(@e&4b>Xu+z`eyLo-6a3?{6zSfMDFD$|U<_d|;^`?4Nw
z;eT@Cy^Psw0s5U=;gJU15itdvdlsiqKcV*eh_}A4S-Z{P)tcDW$`jYoKqdwwVRXl0
zWJcir@vRX~YfJ<$Qb>cpu{ZK4kxE%T`YbwRH#SFBSss#Oo<cCQW6Nc@!Zx&e?TGWa
zUnorP1OpX!Tc9@Ms-w9UQ^^Pc<a$#XgMS)0p)yTI-mTtG_K^3jfPy%}?-_jVso;=H
zd7?a2k?Ba=nH3rDl3^6BohPo=wc&~Bkw8K7My0X-C+A*0<KL)ixSM5{uE<;59NFp|
z8+uXhfFG4W<_c*Tt?YAKt_=n8XPJ`zQmXw~5sE}h{{p6SX!ZJeeMbNQ010qNSu}G1
z01FcU01FcV0GgZ_0004HNkl<Zc-rmRK@NZ*3<N+RG5-I#gu{CF;8{p#p3rV7Xls#i
z8<Btvk$?=5fDDm<43U5gk$?=5fDB^*0Kop{O6E#b0sx9$1XKa2s4KyH3EWp#699W5
zc7hin0CoZz4mb~})N2_4!;VZK8-QU)9*_aRup<+Ifk*$52lN<$0L(k!KmdS$4J7~o
z0Dup^3Il*kz|s5y0PqR~09=uA8<Btvk$?=5fDDm<43U5gk$?=5fD0GkI1hGWeq!aQ
R!?6GW002ovPDHLkV1iXrP9p#S

delta 200
zcmbQk-N7_LGK`slfx)X&(Go~876-XIF|0c$^AgBm3-AeX1=2r%|37M>mJMVvl?3?(
zGyIR9sI(QxTjc5D7*a9k?UjRq42m2qjwkJ3{+@BT!nK^Kd&5)9$$>1gUKeIZ&WX4G
z$M}|Q+1`fF$6uXaE|*lzIDbdIorB%6sGrYXGm2~o&EI!!|0lyujIXBWpRae_+Ftd)
z)XtDKVx6ADT>sO5r?2J?crF|aG)`LlLBHM2=?t1PnkG*H+RxzW>gTe~DWM4f!1Pb+

diff --git a/img/sex/missionary/penetrators/sus/rightarm.png b/img/sex/missionary/penetrators/sus/rightarm.png
index f15673200981209f99891653dd8461dd76af0454..6eb3552b7a7a381a18105d84db953c5940a0a898 100644
GIT binary patch
delta 1221
zcmV;$1Umc40?i4K7=Hu<0001wdCWKf00WD9R9JLUVRs;Ka&Km7Y-J#Hd2nSQWq4_3
z004N})s|a!Bqt1p-)j|F0=goWBW~wp2U&i8%H3^y?BrxJc}dY_Xj(`@p9H?vAHVPG
zH$228F0~ro+zTFU+Bh+Y^8Tzx-%8nMta#}$M=vS5KK<|<5r5i;d42xMm=W~y_Vr~?
zjw1P>$X`8uH&6D%yu8fwCy&Bkmigm6_jjjWt~}noXKd{GI?|fzh>t%u_1xk;f?&ty
z<X+}z6|Z4j@7B<wWEmG}nPrrYHmDJklub&Lk~XcoA2i^i^5Tk~d9d7bA(a~sDMF%`
zs3>i&(qu{q%YWb{f?0m~Lbu&^n;R4`JPDFaP)1mBx9d6h)%LBTy~ha=onY!)tl$^(
zi94Mr%J~ba^W%Qzk=+4)wjUpWg%X9-33FhBS^ArbZuFj8a^0W>f`<MLGS&G|0Eb}P
z;0y@}6elrqDwVksA&vn)3C~$B<qia7#uHw$ia6i|AAj3eQ|Xpv<F{#)5I~r?RG?{+
zV5Ms6msSnrP@0&UnOn86X6fSU=I+%`EoPOf)vDK8qqdqMp<&@sBcerKjhmoWt$C|0
zT5Fjwn$VnBospR6+@))`?!ETtt>-}c3>`Ln)DfeNye3bXI&J!_GiIB)Xd#uBE?d6p
ziq%$bq<`9$t=qQmx?{JUFKRc{>l3rD<o=!-J*WZLbu&{4J*i>3)~5<O$B7+gAjV1{
zUJn5zG#_RqNR<z{>o6;gQ5DAU(hi(ShZqRzBDPI0cJJiAaJx|V|CSqnBzGNj{{^}0
zp!<g0S8m@>o9BEVrw$7awo`^Ds6|kI5Ll5MkbmHx>#v_(@Xr)=cbnW#1Z|AEa9_0r
z1U$Rq6J)WoNG#pDW~_=#)v4BJT#0htE|j-Eg$`1DO8L-d0(G&091zsQ3RvV-6~SF&
z&82grM25*6VbWQ;gZtFBW<!o3v;)Un&U18(+o1im!RsD)hl2Fz8)?{bcat`eKqGdS
z*?(tWi`!VjV_<(%+9+8GIRyuOxlXdneJ`X)<btO$$7q#sP19T(ew-_z)43Or7*)1q
zP8>&$lP~+jnb6bW?nhZ+VA+wrlsdXs8okz>wUJ2UG8l<H*>PVDT!4tx+QYr2A?-YQ
zuHl#2sjuxN5_#AV0A49Q6&cGG)1t`g6Mv;`wy+9Gczg5)Te;*tLW~}RU+w>gie#fW
z@lV$ECq`C9hE5W?3jhEB5>QN3MF0Q*0001KE-s8Zn$~mY@S6WEudj3f0004WQchC<
zK<3zH00009a7bBm000XU000XU0RWnu7ytkOy-7qtRCwC$)XQzdFbn`tSrY_y27eG3
zO(1y!+xyRyAQKd3(O%xWQ{YErDF6Tf0000000000006*`v}AllYyXw|Qfk!P6SW?x
z3?j}sj(WERON~gButuM~#qIb<iT>)D4y^MUnK#zgJ`*Ku*NkIaEit~t^u8JF(K5ei
z`}8kS!WL0lzg@txpCh@y&&b`8=RT)@i4vCY7T;gs5iNa%ej`44$4cS`0000000000
j0000000000z+ZR+>)sEvKbNA#00000NkvXXu0mjf%A7kF

literal 329
zcmeAS@N?(olHy`uVBq!ia0y~yU;;838aSANq*te+C6Hn)4sv&5Sa(k5C6L1(;1l8s
zq%-yOdaPz$D}MfA*8iriz-XWlYe|q_FvEW!kh!1+G>PH5r;B4q#hkZS4f&2J@UR?^
z`0;->zmQ;Txoq?upQ%cda`!a723rSIiv>K`zqRDA>b;|trFS>CtIz-HzOFfHw|s3>
z?3Ty9S0?W}A@=Rf%#-*3^qN_FxGso#pZsOotK@eHW&)?;*Ium7VSf3?*7wZgeE+W}
zd_%13I(4taT9&cD|Kl3JK<fTY?mLI9>n7@6`91Z<!E^CpfB!v=`1>PKW}00!7Kfk+
aHQcwWKFs)Fa^BN$khrI-pUXO@geCwLIdxnB

diff --git a/types/clothing.d.ts b/types/clothing.d.ts
index 631e104c6d..183088938e 100644
--- a/types/clothing.d.ts
+++ b/types/clothing.d.ts
@@ -50,6 +50,8 @@ declare module "twine-sugarcube" {
 		outfit: {
 			[x in ClothedSlots]: string;
 		}[];
+		lowerwetstage: number;
+		underlowerwetstage: number;
 	}
 
 	export interface SugarCubeSetupObject {
@@ -150,7 +152,6 @@ declare global {
 		 */
 		exposed?: 0 | 1 | 2;
 		plural: number;
-		exposed: number;
 		exposed_base?: number;
 		vagina_exposed?: number;
 		vagina_exposed_base?: number;
-- 
GitLab