From 948d18acad49b1429709bdc6fa68ffacaaf8fcd1 Mon Sep 17 00:00:00 2001
From: bananarama92 <35132-bananarama92@users.noreply.gitgud.io>
Date: Mon, 5 Sep 2022 20:50:30 +0200
Subject: [PATCH 1/2] MAINT: Refactor the DroneMask code

Move global variable getting and setting to smaller wrapper functions
---
 .../Inventory/ItemHead/DroneMask/DroneMask.js | 36 ++++++++++++-------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/BondageClub/Screens/Inventory/ItemHead/DroneMask/DroneMask.js b/BondageClub/Screens/Inventory/ItemHead/DroneMask/DroneMask.js
index c095bba156..8bfc629247 100644
--- a/BondageClub/Screens/Inventory/ItemHead/DroneMask/DroneMask.js
+++ b/BondageClub/Screens/Inventory/ItemHead/DroneMask/DroneMask.js
@@ -10,10 +10,13 @@ var InventoryItemHeadDroneMaskYOffset = 89; // For testing text position for tho
 
 // Load item extension properties
 function InventoryItemHeadDroneMaskPattern5Load() {
+	InventoryItemHeadDroneMaskOriginalText = DialogFocusItem.Property.Text;
+	InventoryItemHeadDroneMaskPattern5LoadBase();
+}
 
-	const C = CharacterGetCurrent();
+function InventoryItemHeadDroneMaskPattern5LoadBase() {
 
-	InventoryItemHeadDroneMaskOriginalText = DialogFocusItem.Property.Text;
+	const C = CharacterGetCurrent();
 
 	// Dynamically displayed input
 	const input = ElementCreateInput(
@@ -39,11 +42,13 @@ function InventoryItemHeadDroneMaskPattern5Draw() {
 // Click function
 function InventoryItemHeadDroneMaskPattern5Click() {
 	if (MouseIn(1330, 731, 340, 64)) {
-		InventoryItemHeadDroneMaskPattern5SaveAndExit();
+		InventoryItemHeadDroneMaskPattern5SaveAndExit(InventoryItemHeadDroneMaskOriginalText);
+		InventoryItemHeadDroneMaskPattern5ExitSubscreen();
 	}
 	// Exits screen
 	else if (MouseIn(1885, 25, 90, 90)) {
-		InventoryItemHeadDroneMaskPattern5Exit();
+		InventoryItemHeadDroneMaskPattern5Exit(InventoryItemHeadDroneMaskOriginalText);
+		InventoryItemHeadDroneMaskPattern5ExitSubscreen();
 	}
 }
 
@@ -55,7 +60,7 @@ function InventoryItemHeadDroneMaskPattern5ExitSubscreen() {
 }
 
 // Save text changes and exit subscreen
-function InventoryItemHeadDroneMaskPattern5SaveAndExit() {
+function InventoryItemHeadDroneMaskPattern5SaveAndExit(OriginalText) {
 	const C = CharacterGetCurrent();
 	const item = DialogFocusItem;
 
@@ -63,7 +68,7 @@ function InventoryItemHeadDroneMaskPattern5SaveAndExit() {
 	if (InventoryItemHeadDroneMaskAllowedChars.test(text)) {
 		item.Property.Text = text;
 	}
-	if (CurrentScreen === "ChatRoom" && text !== InventoryItemHeadDroneMaskOriginalText) {
+	if (CurrentScreen === "ChatRoom" && text !== OriginalText) {
 		const dictionary = [
 			{ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber },
 			{ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber },
@@ -75,14 +80,12 @@ function InventoryItemHeadDroneMaskPattern5SaveAndExit() {
 	}
 	CharacterRefresh(C);
 	ChatRoomCharacterItemUpdate(C, item.Asset.Group.Name);
-	InventoryItemHeadDroneMaskPattern5ExitSubscreen();
 }
 
 // Revert text changes and exit subscreen
-function InventoryItemHeadDroneMaskPattern5Exit() {
-	DialogFocusItem.Property.Text = InventoryItemHeadDroneMaskOriginalText;
+function InventoryItemHeadDroneMaskPattern5Exit(OriginalText) {
+	DialogFocusItem.Property.Text = OriginalText;
 	CharacterLoadCanvas(CharacterGetCurrent());
-	InventoryItemHeadDroneMaskPattern5ExitSubscreen();
 }
 
 // Exit the item's extended screen
@@ -104,6 +107,15 @@ const InventoryItemHeadDroneMaskTextChange = CommonLimitFunction((C, item, text)
 // Drawing function for tag text
 function AssetsItemHeadDroneMaskAfterDraw({
     C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color
+}) {
+	const YOffset = InventoryItemHeadDroneMaskYOffset;
+	AssetsItemHeadDroneMaskAfterDrawBase({
+		C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color, YOffset,
+	})
+}
+
+function AssetsItemHeadDroneMaskAfterDrawBase({
+    C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color, YOffset,
 }) {
 	if (L === "_Text"){
 		const Properties = Property || {};
@@ -133,7 +145,7 @@ function AssetsItemHeadDroneMaskAfterDraw({
 		DynamicDrawText(text, ctx, Width/2, Height/ (isAlone? 2: 2.5), drawOptions);
 
 		//And print the canvas onto the character based on the above positions
-		drawCanvas(TempCanvas, X+ XOffset, Y + InventoryItemHeadDroneMaskYOffset, AlphaMasks);
-		drawCanvasBlink(TempCanvas, X + XOffset, Y + InventoryItemHeadDroneMaskYOffset, AlphaMasks);
+		drawCanvas(TempCanvas, X+ XOffset, Y + YOffset, AlphaMasks);
+		drawCanvasBlink(TempCanvas, X + XOffset, Y + YOffset, AlphaMasks);
 	}
 }
-- 
GitLab


From beceb38a0966ec6b014057dfaefcbb23099796c0 Mon Sep 17 00:00:00 2001
From: bananarama92 <35132-bananarama92@users.noreply.gitgud.io>
Date: Mon, 5 Sep 2022 20:52:42 +0200
Subject: [PATCH 2/2] ENH: Add a hood-based variant of the Smooth Latex Mask

---
 BondageClub/Assets/Female3DCG/Female3DCG.csv  |  5 +-
 BondageClub/Assets/Female3DCG/Female3DCG.js   | 60 +++++++++++++++++++
 .../Assets/Female3DCG/Female3DCGExtended.js   |  6 +-
 .../Character/Player/Dialog_Player.csv        | 47 +++++++++++++++
 .../Inventory/ItemHood/DroneMask/DroneMask.js | 51 ++++++++++++++++
 BondageClub/index.html                        |  1 +
 6 files changed, 167 insertions(+), 3 deletions(-)
 create mode 100644 BondageClub/Screens/Inventory/ItemHood/DroneMask/DroneMask.js

diff --git a/BondageClub/Assets/Female3DCG/Female3DCG.csv b/BondageClub/Assets/Female3DCG/Female3DCG.csv
index 57afff5393..dbf4ae8523 100644
--- a/BondageClub/Assets/Female3DCG/Female3DCG.csv
+++ b/BondageClub/Assets/Female3DCG/Female3DCG.csv
@@ -1349,7 +1349,7 @@ ItemMouth3,PaciGag,Pacifier Gag
 ItemMouth3,Tentacles,Tentacle
 ItemMouth3,PonyGag,Bridle Gag
 ItemMouth3,Slime,Slime
-ItemMouth3,Stitches,Stitches 
+ItemMouth3,Stitches,Stitches
 ItemMouth3,FurScarf,Fur Scarf
 ItemHead,,Eyes
 ItemHead,ClothBlindfold,Cloth Blindfold
@@ -1383,7 +1383,7 @@ ItemHead,MedicalPatch,Medical Patches
 ItemHead,DroneMask,Smooth Latex Mask
 ItemHead,Slime,Slime
 ItemHead,FurScarf,Fur Scarf
-ItemHead,Stitches,Stitches 
+ItemHead,Stitches,Stitches
 ItemNose,,Nose
 ItemNose,NoseHook,Nose Hook
 ItemNose,PigNose,Pig Nose
@@ -1428,6 +1428,7 @@ ItemHood,Slime,Slime
 ItemHood,KittyHood,Kitty Hood
 ItemHood,LatexDogHood,Latex Dog Hood
 ItemHood,OpenMouthPlugHood,Latex Open Mouth Plug Hood
+ItemHood,DroneMask,Smooth Latex Mask
 ItemEars,,Ears
 ItemEars,LightDutyEarPlugs,Light Duty Ear Plugs
 ItemEars,HeavyDutyEarPlugs,Heavy Duty Ear Plugs
diff --git a/BondageClub/Assets/Female3DCG/Female3DCG.js b/BondageClub/Assets/Female3DCG/Female3DCG.js
index 5c5f2b41d7..d5ab1b1322 100644
--- a/BondageClub/Assets/Female3DCG/Female3DCG.js
+++ b/BondageClub/Assets/Female3DCG/Female3DCG.js
@@ -5895,6 +5895,7 @@ var AssetFemale3DCG = [
 			},
 			{
 				Name: "DroneMask", Category: ["SciFi"], Fetish: ["Latex"], Value: 90, Difficulty: 5, DefaultColor: ["#222222", "#CCCCCC", "#7F7F7F", "#00F4FD", "#E700CA", ], Time: 10, AllowLock: true, DrawLocks: false, Extended: true, DynamicAfterDraw: true,
+				BuyGroup: "DroneMask",
 				Block:["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNose"],
 				Hide: ["Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "Blush"],
 				HideItem: ["HatFacePaint", "MaskFacePaint", "ClothAccessoryFacePaint"],
@@ -6314,6 +6315,65 @@ var AssetFemale3DCG = [
 				]
 
 			},
+			{
+				Name: "DroneMask", Category: ["SciFi"], Fetish: ["Latex"], Value: -1, Difficulty: 5, DefaultColor: ["#222222", "#CCCCCC", "#7F7F7F", "#00F4FD", "#E700CA", ], Time: 10, AllowLock: true, DrawLocks: false, Extended: true, DynamicAfterDraw: true,
+				DynamicGroupName: "ItemHead",
+				BuyGroup: "DroneMask",
+				Block:["ItemMouth", "ItemMouth2", "ItemMouth3", "ItemNose"],
+				Hide: ["Glasses", "ItemMouth", "ItemMouth2", "ItemMouth3", "Blush", "Mask"],
+				HideItem: ["HatFacePaint", "MaskFacePaint", "ClothAccessoryFacePaint"],
+				Layer: [ // Colors layer references: Base, Shine, EyeRegular, MouthOnahole, Barcode
+					{ Name: "Base", HasType: false, AllowModuleTypes: ["h0"] },
+					{ Name: "Shine", HasType: false, AllowModuleTypes: ["h0"] },
+					{ Name: "BaseHelm", HasType: false, AllowModuleTypes: ["h1","h2"], CopyLayerColor: "Base", Alpha: [{ Masks: [[0, 0, 500, 200]], Group: ["Head"] }], },
+					{ Name: "ShineHelm", HasType: false, AllowModuleTypes: ["h1","h2"], CopyLayerColor: "Shine" },
+
+					// All Non-part-reliant Patterns
+					{ Name: "Barcode", HasType: false, AllowModuleTypes: ["p1"]},
+					{ Name: "Scarab", HasType: false, AllowModuleTypes: ["p2"], CopyLayerColor: "Barcode"},
+					{ Name: "Hexagon", HasType: false, AllowModuleTypes: ["p3"], CopyLayerColor: "Barcode"},
+					{ Name: "TwoLines", HasType: false, AllowModuleTypes: ["p4"], CopyLayerColor: "Barcode"},
+					{ Name: "Text", HasImage: false, CopyLayerColor: "Barcode"},
+
+					// All Eyes
+					{ Name: "EyeRegularShine", HasType: false, AllowModuleTypes: ["e1"], CopyLayerColor: "Shine" },
+					{ Name: "EyeRegular", HasType: false, AllowModuleTypes: ["e1"], },
+					{ Name: "EyeRegularGlow", HasType: false, AllowModuleTypes: ["e1g1"], CopyLayerColor: "EyeRegular" },
+
+					{ Name: "EyeSpiralShine", HasType: false, AllowModuleTypes: ["e2"], CopyLayerColor: "Shine" },
+					{ Name: "EyeSpiral", HasType: false, AllowModuleTypes: ["e2"], CopyLayerColor: "EyeRegular" },
+					{ Name: "EyeSpiralGlow", HasType: false, AllowModuleTypes: ["e2g1"], CopyLayerColor: "EyeRegular" },
+
+					{ Name: "EyeSmileShine", HasType: false, AllowModuleTypes: ["e3"], CopyLayerColor: "Shine" },
+					{ Name: "EyeSmile", HasType: false, AllowModuleTypes: ["e3"], CopyLayerColor: "EyeRegular" },
+					{ Name: "EyeSmileGlow", HasType: false, AllowModuleTypes: ["e3g1"], CopyLayerColor: "EyeRegular" },
+
+					{ Name: "EyeHolesShine", HasType: false, AllowModuleTypes: ["e4"], CopyLayerColor: "Shine" },
+					{ Name: "EyeHoles", HasType: false, AllowModuleTypes: ["e4"], CopyLayerColor: "EyeRegular" },
+
+					{ Name: "EyeSculpted", HasType: false, AllowModuleTypes: ["e5"], CopyLayerColor: "EyeRegular" },
+					{ Name: "EyeSculptedShine", HasType: false, AllowModuleTypes: ["e5"], CopyLayerColor: "Shine" },
+					{ Name: "EyeSculptedGlow", HasType: false, AllowModuleTypes: ["e5g1"], CopyLayerColor: "EyeRegular" },
+
+					{ Name: "EyeConcave", HasType: false, AllowModuleTypes: ["e6"], CopyLayerColor: "Base"},
+					{ Name: "EyeConcaveShine", HasType: false, AllowModuleTypes: ["e6"], CopyLayerColor: "Shine"},
+
+					// All Mouths
+					{ Name: "MouthOnahole", HasType: false, AllowModuleTypes: ["m1"]},
+
+					{ Name: "MouthFleshlightShine", HasType: false, AllowModuleTypes: ["m2"], CopyLayerColor: "Shine" },
+					{ Name: "MouthFleshlight", HasType: false, AllowModuleTypes: ["m2"], CopyLayerColor: "MouthOnahole" },
+
+					{ Name: "MouthSmileShine", HasType: false, AllowModuleTypes: ["m3"], CopyLayerColor: "Shine" },
+					{ Name: "MouthSmile", HasType: false, AllowModuleTypes: ["m3"], CopyLayerColor: "MouthOnahole" },
+					{ Name: "MouthSmileGlow", HasType: false, AllowModuleTypes: ["m3g1"], CopyLayerColor: "MouthOnahole" },
+
+					{ Name: "MouthHolesShine", HasType: false, AllowModuleTypes: ["m4"], CopyLayerColor: "Shine" },
+					{ Name: "MouthHoles", HasType: false, AllowModuleTypes: ["m4"], CopyLayerColor: "MouthOnahole" },
+
+					{ Name: "MouthSculpted", HasType: false, AllowModuleTypes: ["m5"], CopyLayerColor: "MouthOnahole" },
+				],
+			},
 			AssetSpankingToys
 		],
 		Color: ["Default", "#202020", "#808080", "#bbbbbb", "#aa8080", "#80aa80", "#8080aa", "#aaaa80", "#80aaaa", "#aa80aa", "#cc3333", "#33cc33", "#3333cc", "#cccc33", "#33cccc", "#cc33cc"]
diff --git a/BondageClub/Assets/Female3DCG/Female3DCGExtended.js b/BondageClub/Assets/Female3DCG/Female3DCGExtended.js
index 392ecc40b6..9d7d0301fa 100644
--- a/BondageClub/Assets/Female3DCG/Female3DCGExtended.js
+++ b/BondageClub/Assets/Female3DCG/Female3DCGExtended.js
@@ -2663,7 +2663,11 @@ var AssetFemale3DCGExtended = {
 					}
 				]
 			}
-		}
+		},
+		DroneMask: {
+			Archetype: ExtendedArchetype.MODULAR,
+			CopyConfig: { GroupName: "ItemHead", AssetName: "DroneMask" },
+		}, // DroneMask
 	}, // ItemHood
 	ItemDevices: {
 		FuturisticCrate: {
diff --git a/BondageClub/Screens/Character/Player/Dialog_Player.csv b/BondageClub/Screens/Character/Player/Dialog_Player.csv
index b579e0584e..6de2bf8f0f 100644
--- a/BondageClub/Screens/Character/Player/Dialog_Player.csv
+++ b/BondageClub/Screens/Character/Player/Dialog_Player.csv
@@ -3089,6 +3089,53 @@ ItemHoodHeadboxSeethroughSeethrough,,,Lights On,,
 ItemHoodHeadboxSeethroughOpaque,,,Lights Off,,
 ItemHoodHeadboxSeethroughSetOpaque,,,SourceCharacter turns off the lights of DestinationCharacter headbox.,,
 ItemHoodHeadboxSeethroughSetSeethrough,,,SourceCharacter turns on the lights of DestinationCharacter headbox.,,
+ItemHoodDroneMaskSelectBase,,,Select Mask Details,,
+ItemHoodDroneMaskSelectEyes,,,Select Eye Shape,,
+ItemHoodDroneMaskModuleEyes,,,Eyes,,
+ItemHoodDroneMaskOptione0,,,Smooth,,
+ItemHoodDroneMaskOptione1,,,Open,,
+ItemHoodDroneMaskOptione2,,,Spirals,,
+ItemHoodDroneMaskOptione3,,,Smile,,
+ItemHoodDroneMaskOptione4,,,Holes,,
+ItemHoodDroneMaskOptione5,,,Sculpted,,
+ItemHoodDroneMaskOptione6,,,Concave,,
+ItemHoodDroneMaskSetEyes,,,SourceCharacter changes the eyes on DestinationCharacter smooth latex mask.,,
+ItemHoodDroneMaskSelectMouth,,,Select Mouth Shape,,
+ItemHoodDroneMaskModuleMouth,,,Mouth,,
+ItemHoodDroneMaskOptionm0,,,Smooth,,
+ItemHoodDroneMaskOptionm1,,,Onahole,,
+ItemHoodDroneMaskOptionm2,,,Pussy,,
+ItemHoodDroneMaskOptionm3,,,Smile,,
+ItemHoodDroneMaskOptionm4,,,Holes,,
+ItemHoodDroneMaskOptionm5,,,Sculpted,,
+ItemHoodDroneMaskSetMouth,,,SourceCharacter changes the mouth on DestinationCharacter smooth latex mask.,,
+ItemHoodDroneMaskSelectGlow,,,Switch Glow Function,,
+ItemHoodDroneMaskModuleGlow,,,Glow,,
+ItemHoodDroneMaskOptiong0,,,Off,,
+ItemHoodDroneMaskOptiong1,,,On,,
+ItemHoodDroneMaskSetGlow,,,SourceCharacter flicks the glow switch on DestinationCharacter smooth latex mask.,,
+ItemHoodDroneMaskSelectPattern,,,Select Mask Pattern,,
+ItemHoodDroneMaskModulePattern,,,Pattern,,
+ItemHoodDroneMaskOptionp0,,,None,,
+ItemHoodDroneMaskOptionp1,,,Barcode,,
+ItemHoodDroneMaskOptionp2,,,Scarab,,
+ItemHoodDroneMaskOptionp3,,,Hexagon,,
+ItemHoodDroneMaskOptionp4,,,Lines,,
+ItemHoodDroneMaskOptionp5,,,Text,,
+ItemHoodDroneMaskTextRemove,,,SourceCharacter removes the text from DestinationCharacterName smooth latex mask.,,
+ItemHoodDroneMaskTextChange,,,SourceCharacter changes the text on DestinationCharacterName smooth latex mask to read 'NewText'.,,
+ItemHoodDroneMaskSetPattern,,,SourceCharacter changes the pattern on DestinationCharacter smooth latex mask.,,
+ItemHoodDroneMaskSelectSight,,,Select Lens Quality,,
+ItemHoodDroneMaskModuleSight,,,Lenses,,
+ItemHoodDroneMaskOptions0,,,Opaque,,
+ItemHoodDroneMaskOptions1,,,One-Way,,
+ItemHoodDroneMaskSetSight,,,SourceCharacter changes the inner lining of DestinationCharacter smooth latex mask.,,
+ItemHoodDroneMaskSelectHelmet,,,Select Coverage,,
+ItemHoodDroneMaskModuleHelmet,,,Coverage,,
+ItemHoodDroneMaskOptionh0,,,Mask,,
+ItemHoodDroneMaskOptionh1,,,Hood,,
+ItemHoodDroneMaskOptionh2,,,Total Hood,,
+ItemHoodDroneMaskSetHelmet,,,SourceCharacter changes the coverage of DestinationCharacter smooth latex mask.,,
 ItemMouthPonyGagSelectBase,,,Select bridle Gag Accessories,,
 ItemMouthPonyGagSelectGag,,,Select Gag Accessory,,
 ItemMouthPonyGagModuleGag,,,Gag,,
diff --git a/BondageClub/Screens/Inventory/ItemHood/DroneMask/DroneMask.js b/BondageClub/Screens/Inventory/ItemHood/DroneMask/DroneMask.js
new file mode 100644
index 0000000000..20437190d4
--- /dev/null
+++ b/BondageClub/Screens/Inventory/ItemHood/DroneMask/DroneMask.js
@@ -0,0 +1,51 @@
+// Wrap around the itemHead/DroneMask/DroneMask.js code as much as possible
+
+"use strict";
+let InventoryItemHoodDroneMaskOriginalText = "";
+var InventoryItemHoodDroneMaskYOffset = 89; // For testing text position for those with longer hair
+
+// Load item extension properties
+function InventoryItemHoodDroneMaskPattern5Load() {
+	InventoryItemHoodDroneMaskOriginalText = DialogFocusItem.Property.Text;
+	InventoryItemHeadDroneMaskPattern5LoadBase();
+}
+
+// Draw extension screen image
+function InventoryItemHoodDroneMaskPattern5Draw() {
+    InventoryItemHeadDroneMaskPattern5Draw();
+}
+
+// Click function
+function InventoryItemHoodDroneMaskPattern5Click() {
+	if (MouseIn(1330, 731, 340, 64)) {
+		InventoryItemHeadDroneMaskPattern5SaveAndExit(InventoryItemHoodDroneMaskOriginalText);
+		InventoryItemHoodDroneMaskPattern5ExitSubscreen();
+	}
+	// Exits screen
+	else if (MouseIn(1885, 25, 90, 90)) {
+		InventoryItemHeadDroneMaskPattern5Exit(InventoryItemHoodDroneMaskOriginalText);
+		InventoryItemHoodDroneMaskPattern5ExitSubscreen();
+	}
+}
+
+// Exit the subscreen
+function InventoryItemHoodDroneMaskPattern5ExitSubscreen() {
+	ElementRemove(InventoryItemHeadDroneMaskInputId);
+	InventoryItemHoodDroneMaskOriginalText = "";
+	ExtendedItemSubscreen = null;
+}
+
+// Exit the item's extended screen
+function InventoryItemHoodDroneMaskExit() {
+	InventoryItemHeadDroneMaskExit();
+}
+
+// Drawing function for tag text
+function AssetsItemHoodDroneMaskAfterDraw({
+    C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color,
+}) {
+	let YOffset = InventoryItemHoodDroneMaskYOffset;
+	AssetsItemHeadDroneMaskAfterDrawBase({
+		C, A, X, Y, Property, drawCanvas, drawCanvasBlink, AlphaMasks, L, Color, YOffset,
+	})
+}
diff --git a/BondageClub/index.html b/BondageClub/index.html
index 8497475cc6..e08f0793b5 100644
--- a/BondageClub/index.html
+++ b/BondageClub/index.html
@@ -301,6 +301,7 @@
 <script src="Screens/Inventory/Wings/SteampunkWings/SteampunkWings.js"></script>
 <script src="Screens/Inventory/ItemNeck/TechnoCollar/TechnoCollar.js"></script>
 <script src="Screens/Inventory/ItemHead/DroneMask/DroneMask.js"></script>
+<script src="Screens/Inventory/ItemHood/DroneMask/DroneMask.js"></script>
 <script src="Screens/Inventory/ItemNipples/LactationPump/LactationPump.js"></script>
 <script>
 
-- 
GitLab