diff --git a/BondageClub/Assets/Female3DCG/Female3DCG.js b/BondageClub/Assets/Female3DCG/Female3DCG.js
index d2504898671bbacac67f705f72a9cdf0d24a96e3..c798f24dce8caefa6c3edd9d0dbbc92c184aa43d 100644
--- a/BondageClub/Assets/Female3DCG/Female3DCG.js
+++ b/BondageClub/Assets/Female3DCG/Female3DCG.js
@@ -97,7 +97,7 @@ const E = /** @type {const} */ ({
 
 	/**
 	 * Marks the item as a urethral insert.
-	 * 
+	 *
 	 * Used when checking if the item should allow the penis to be limp.
 	 */
 	ForcedErection: "ForcedErection",
@@ -7764,7 +7764,7 @@ var AssetFemale3DCG = [
 						Name: "Ankle",
 						AllowTypes: { n: 1 },
 						Priority: 24,
-						AllowColorize: true,					
+						AllowColorize: true,
 					},
 					{
 						Name: "Knee",
@@ -10123,10 +10123,7 @@ var AssetFemale3DCG = [
 				Top: 30,
 				Left: 150,
 				DefaultColor: ["#808080", "#A0A0A0"],
-				HideItem: [
-					"HairAccessory1EarsElfEars", 
-					"HairAccessory2EarsElfEars", 
-				],
+				HideItem: ["HairAccessory1EarsElfEars", "HairAccessory2EarsElfEars"],
 				Layer: [
 					{
 						Name: "Main",
@@ -10810,10 +10807,7 @@ var AssetFemale3DCG = [
 				Top: 30,
 				Left: 150,
 				DefaultColor: ["#808080", "#A0A0A0"],
-				HideItem: [
-					"HairAccessory1EarsElfEars",
-					"HairAccessory2EarsElfEars",
-				],
+				HideItem: ["HairAccessory1EarsElfEars", "HairAccessory2EarsElfEars"],
 				Layer: [
 					{
 						Name: "Main",
@@ -11540,17 +11534,12 @@ var AssetFemale3DCG = [
 					BackElbowTouch: PoseType.HIDE,
 					BackBoxTie: PoseType.HIDE,
 				},
-				Hide: [
-					"LeftHand",
-					"RightHand",
-				],
+				Hide: ["LeftHand", "RightHand"],
 				Layer: [
 					{ Name: "Main", Priority: 29 },
-					{ Name: "Fur",
-						AllowTypes: { typed: 0 },
-						Priority: 32,
-					},
-					{ Name: "FurSup",
+					{ Name: "Fur", AllowTypes: { typed: 0 }, Priority: 32 },
+					{
+						Name: "FurSup",
 						PoseMapping: {
 							BackCuffs: "BackCuffs",
 							AllFours: PoseType.HIDE,
@@ -17191,7 +17180,12 @@ var AssetFemale3DCG = [
 			{
 				Name: "PlasticChastityCage1",
 				Gender: "M",
-				Prerequisite: ["AccessVulva", "HasPenis", "AccessFullPenis", "NoErection"],
+				Prerequisite: [
+					"AccessVulva",
+					"HasPenis",
+					"AccessFullPenis",
+					"NoErection",
+				],
 				Difficulty: 50,
 				Value: 20,
 				Effect: [E.Chaste],
@@ -17242,7 +17236,12 @@ var AssetFemale3DCG = [
 			{
 				Name: "PlasticChastityCage2",
 				Gender: "M",
-				Prerequisite: ["AccessVulva", "HasPenis", "AccessFullPenis", "NoErection"],
+				Prerequisite: [
+					"AccessVulva",
+					"HasPenis",
+					"AccessFullPenis",
+					"NoErection",
+				],
 				Value: 20,
 				Difficulty: 50,
 				Effect: [E.Chaste],
@@ -17273,7 +17272,12 @@ var AssetFemale3DCG = [
 			{
 				Name: "TechnoChastityCage",
 				Gender: "M",
-				Prerequisite: ["AccessVulva", "HasPenis", "AccessFullPenis", "NoErection"],
+				Prerequisite: [
+					"AccessVulva",
+					"HasPenis",
+					"AccessFullPenis",
+					"NoErection",
+				],
 				Category: ["SciFi"],
 				Value: 50,
 				Difficulty: 50,
@@ -17306,7 +17310,12 @@ var AssetFemale3DCG = [
 				Name: "FlatChastityCage",
 				Gender: "M",
 				Fetish: ["Metal"],
-				Prerequisite: ["AccessVulva", "HasPenis", "AccessFullPenis", "NoErection"],
+				Prerequisite: [
+					"AccessVulva",
+					"HasPenis",
+					"AccessFullPenis",
+					"NoErection",
+				],
 				Value: 25,
 				Difficulty: 50,
 				Effect: [E.Chaste],
@@ -17336,7 +17345,12 @@ var AssetFemale3DCG = [
 			{
 				Name: "ChastityPouch",
 				Gender: "M",
-				Prerequisite: ["AccessVulva", "HasPenis", "AccessFullPenis", "NoErection"],
+				Prerequisite: [
+					"AccessVulva",
+					"HasPenis",
+					"AccessFullPenis",
+					"NoErection",
+				],
 				Value: 25,
 				Difficulty: 50,
 				Effect: [E.Chaste],
@@ -17627,18 +17641,32 @@ var AssetFemale3DCG = [
 				Gender: "M",
 				Value: 10,
 				Hide: ["Pussy"],
-				Prerequisite: ["NoChastityCage"],
+				Prerequisite: ["NoChastityCage", "HasPenis"],
 				Effect: ["ForcedErection"],
 				Left: 200,
 				Top: 410,
 				Layer: [
 					{ Name: "Sound", AllowTypes: { typed: 0 } },
 					{ Name: "Shine", AllowTypes: { typed: 0 } },
-					{ Name: "SoundOut", CopyLayerColor: "Sound", AllowTypes: { typed: 1 } },
-					{ Name: "ShineOut", CopyLayerColor: "Shine", AllowTypes: { typed: 1 } },
-					{ Name: "Penis", InheritColor: "Pussy", ColorSuffix: { HEX_COLOR: "White" }, AllowTypes: { typed: [0, 1, 2] } },
-				]
-			}
+					{
+						Name: "SoundOut",
+						CopyLayerColor: "Sound",
+						AllowTypes: { typed: 1 },
+					},
+					{
+						Name: "ShineOut",
+						CopyLayerColor: "Shine",
+						AllowTypes: { typed: 1 },
+					},
+					{
+						Name: "Penis",
+						InheritColor: "Pussy",
+						ColorSuffix: { HEX_COLOR: "White" },
+						AllowTypes: { typed: [0, 1] },
+						HideColoring: true,
+					},
+				],
+			},
 		],
 		Color: [
 			"Default",
diff --git a/BondageClub/Assets/Female3DCG/Female3DCGExtended.js b/BondageClub/Assets/Female3DCG/Female3DCGExtended.js
index 93c011b3de70a3ee7836a32280ba4df697d7fb4b..03e408724ac0dbb5e6c04093659f747feb6c356e 100644
--- a/BondageClub/Assets/Female3DCG/Female3DCGExtended.js
+++ b/BondageClub/Assets/Female3DCG/Female3DCGExtended.js
@@ -9032,12 +9032,12 @@ var AssetFemale3DCGExtended = {
 				{
 					Name: "In",
 					Property: {
-						Effect: [E.DenialMode]
-					}
+						Effect: [E.DenialMode],
+					},
 				},
 				{
-					Name: "Out"
-				}
+					Name: "Out",
+				},
 			],
 			DrawImages: false,
 		}, // UrethralSound
diff --git a/BondageClub/Assets/Female3DCG/LayerNames.csv b/BondageClub/Assets/Female3DCG/LayerNames.csv
index eb5a09d1cd44313e60eee112f4356654e876252a..b53a65ae22d2dda3e8fe6af69a54cffe1c9a817e 100644
--- a/BondageClub/Assets/Female3DCG/LayerNames.csv
+++ b/BondageClub/Assets/Female3DCG/LayerNames.csv
@@ -1817,6 +1817,8 @@ ItemVulvaPiercingsRoundClitPiercingHaremChain,Harem Chain
 ItemVulvaPiercingsRoundClitPiercingHaremVeil,Harem Veil
 ItemVulvaPiercingsRoundClitPiercingRing,Ring
 ItemVulvaPiercingsRoundClitPiercingWeight,Weight
+ItemVulvaPiercingsUrethralSoundSound,Sound
+ItemVulvaPiercingsUrethralSoundShine,Shine
 ItemVulvaPiercingsTapedClitEggEgg,Egg
 ItemVulvaPiercingsTapedClitEggTape,Tape
 ItemVulvaPiercingsVibeEggGlansEgg,Vibe Egg
diff --git a/BondageClub/Screens/Room/Platform/Platform.js b/BondageClub/Screens/Room/Platform/Platform.js
index 636465ff3b58a3816b1446160e56f8c3451a47ac..c118006d5c798618fe0636606cf5c3e9912b5c45 100644
--- a/BondageClub/Screens/Room/Platform/Platform.js
+++ b/BondageClub/Screens/Room/Platform/Platform.js
@@ -2112,7 +2112,7 @@ function PlatformDrawCharacter(C, Time) {
 	if ((X >= 2000) || (Y >= 1000)) return;
 	if ((X + C.Anim.Width <= 0) || (Y + C.Anim.Height <= 0)) return;
 	DrawImageEx("Screens/Room/Platform/Character/" + C.Name + "/" + C.Status + "/" + C.Anim.Name + "/" + C.Anim.Image.toString() + ".png", MainCanvas, X + C.Anim.OffsetX, Y + C.Anim.OffsetY, { Mirror: C.Anim.Mirror, Width: C.Anim.Width, Height: C.Anim.Height } );
-	if (PlatformHeartEffect && (PlatformDialogCharactersAreLovers(C.Name, PlatformPlayer.Name) || C.Camera)) 
+	if (PlatformHeartEffect && (PlatformDialogCharactersAreLovers(C.Name, PlatformPlayer.Name) || C.Camera))
 		DrawImageZoomCanvas("Screens/Room/Platform/Effect/Love.png", MainCanvas, 0, 0, 1000, 1000, X, Y + (((C.Anim.Name === "Crouch") || (C.Anim.Name === "Crawl")) ? C.Height / 3 : 0), C.Width, C.Height);
 	if ((C.Effect != null) && (C.Effect.Name != null) && (C.Effect.End != null) && (C.Effect.End >= Time))
 		DrawImageEx("Screens/Room/Platform/Effect/" + C.Effect.Name + ".png", MainCanvas, X + C.Anim.OffsetX, Y + C.Anim.OffsetY, { Mirror: C.Anim.Mirror, Width: C.Anim.Width, Height: C.Anim.Height } );
diff --git a/BondageClub/Screens/Room/PlatformDialog/PlatformDialog.js b/BondageClub/Screens/Room/PlatformDialog/PlatformDialog.js
index 653af9b39007f9ed36725e04bef76bc7998b9039..2d4319ac1aa1b40ba293aae589162a7e780ead9b 100644
--- a/BondageClub/Screens/Room/PlatformDialog/PlatformDialog.js
+++ b/BondageClub/Screens/Room/PlatformDialog/PlatformDialog.js
@@ -2864,7 +2864,7 @@ var PlatformDialogData = [
 			},
 			{ Text: "(You can hear Lyn the bandit boss struggling in the crate.)" },
 			{ Text: "Minions!  Listen to me!  Release me right now!", Audio: "10", AudioStyle: "serious" },
-			{ 
+			{
 				Text: "Minions?  A deal is a deal, we can negotiate something.", Audio: "20",
 				Answer: [
 					{ Text: "(Open the crate.)", Reply: "(You open the crate and find her in bondage.)", Love: 2 },
@@ -2873,7 +2873,7 @@ var PlatformDialogData = [
 			},
 			{ Character: [{ Name: "Lyn", Status: "Thief", Animation: "Bound", Y: -400 }] },
 			{ Text: "It's you!  Well... thanks... I guess.", Audio: "30", AudioStyle: "serious" },
-			{ 
+			{
 				Text: "My stupid minions prepared a mutiny.  Can you believe it?", Audio: "40", AudioStyle: "serious",
 				Answer: [
 					{ Text: "They should be more loyal.", Reply: "Damn right they should.", Audio: "41", Domination: -1, Love: 1 },
@@ -3136,7 +3136,7 @@ var PlatformDialogData = [
 			{ Text: "Water is life, life is water.  Bring tons of it.", Audio: "40" },
 			{ Text: "I used to sell water and slaves to Slandia soldiers when the war was raging.", Audio: "50" },
 			{ Text: "These were good days, business was booming.", Audio: "60" },
-			{ 
+			{
 				Text: "(Olivia steps in front of you and makes an angry face.)",
 				Character: [
 					{ Name: "Olivia", Status: "Oracle", Pose: "IdleAngry", X: 750 },
@@ -3147,7 +3147,7 @@ var PlatformDialogData = [
 			{ Text: "Excuse me?  War was not a good time!", Audio: "70", AudioStyle: "angry" },
 			{ Text: "Thousands of men died, my father died!  How dare you?", Audio: "80", AudioStyle: "angry" },
 			{ Text: "I'm forced to marry a man I barely know because of your war!", Audio: "90", AudioStyle: "angry" },
-			{ 
+			{
 				Text: "(Lyn gulps and nods slowly.)",
 				Character: [
 					{ Name: "Lyn", Status: "Thief", Pose: "Idle", X: 250 },
@@ -4455,7 +4455,7 @@ var PlatformDialogData = [
 			},
 
 			{ Text: "(You kiss each other on the hand, the cheek, the neck and the lips.)" },
-			{ 
+			{
 				Background: "Black",
 				Character: [
 					{ Name: "Lyn", Status: "Thief", Pose: "IdleCheer", X: 1000 },
diff --git a/BondageClub/Scripts/Drawing.js b/BondageClub/Scripts/Drawing.js
index 83b36f99a9aa66160fb072f17d2de5710d411d18..4e5e25a4c772b1a17db7cda68385c6626f7adf5d 100644
--- a/BondageClub/Scripts/Drawing.js
+++ b/BondageClub/Scripts/Drawing.js
@@ -1242,7 +1242,7 @@ function DrawGetCustomBackground(C) {
  */
 function DrawRoomBackground(URL, bounds, opts) {
 	let { inverted, blur, darken, tints, sizeMode } = opts;
-	
+
 	inverted ??= false;
 	blur ??= 1.0;
 	darken ??= 1.0;
@@ -1780,6 +1780,6 @@ const RectFitIntoRect = CommonMemoize(
 		const sourceRectTuple = [sourceX, sourceY, sourceW, sourceH];
 		/** @type {RectTuple} */
 		const destRectTuple = [destX, destY, destW, destH];
-		
+
 		return [sourceRectTuple, destRectTuple];
-	})
+	});
diff --git a/BondageClub/Tools/Node/AssetCheck.js b/BondageClub/Tools/Node/AssetCheck.js
index ba74a9aab912d099c5d5ea05d327488bddb0423c..060f646f9225ae11890bba236b28c8f3c62d53ee 100644
--- a/BondageClub/Tools/Node/AssetCheck.js
+++ b/BondageClub/Tools/Node/AssetCheck.js
@@ -1042,11 +1042,12 @@ function testAssetHasPNG(assets, extendedDataRecords, poseRecord) {
 						}).filter(i => i != null);
 					});
 				} else if (layer.AllowTypes) {
+					// Filter out `undefined` in case someone messes up `layer.AllowTypes`
 					options = Object.entries(layer.AllowTypes.AllTypes).flatMap(([screenKey, indexSet]) => {
-						return Array.from(indexSet).flatMap(i => {
+						return Array.from(indexSet).map(i => {
 							partialLayerTypes.push(`${screenKey}${i}`);
 							return optionsRecord[screenKey][i];
-						});
+						}).filter(o => o !== undefined);
 					});
 				}