diff --git a/BondageClub/Assets/Female3DCG/Female3DCG.js b/BondageClub/Assets/Female3DCG/Female3DCG.js index ddd3da35af2c0cc22829eefbb17ae85316aa7c8a..3b8c582c0f1c083b833923d1291b9ed7c7bffd67 100644 --- a/BondageClub/Assets/Female3DCG/Female3DCG.js +++ b/BondageClub/Assets/Female3DCG/Female3DCG.js @@ -2894,11 +2894,14 @@ var AssetFemale3DCG = [ ] }, { - Name: "ShockDildo", Gender: "F", Fetish: ["Masochism"], Priority: 11, Value: 70, Time: 10, Extended: true, AlwaysExtend: true, Prerequisite: ["AccessVulva", "HasVagina"], Effect: ["FillVulva"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], AllowActivity: ["ShockItem"], + Name: "ShockDildo", Gender: "F", Fetish: ["Masochism"], Priority: 11, Value: 70, Time: 10, + Extended: true, AlwaysExtend: true, Prerequisite: ["AccessVulva", "HasVagina"], + Effect: ["FillVulva"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], + HasType: false, Layer: [ { Name: "Dildo", AllowColorize: true }, - { Name: "Pussy", AllowColorize: false } - ] + { Name: "Pussy", AllowColorize: false }, + ], }, { Name: "VibratingDildo", Gender: "F", Priority: 11, DefaultColor: "#ED4BEE", BuyGroup: "VibratingDildo", Value: 60, Time: 10, Prerequisite: ["AccessVulva", "HasVagina"], Effect: ["FillVulva"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 10 }], @@ -3162,7 +3165,7 @@ var AssetFemale3DCG = [ { Name: "BunnyTailVibePlug", Fetish: ["Pet"], Effect: ["IsPlugged", "Egged"], Value: 75, Prerequisite: ["AccessButt"], Time: 10, ExpressionTrigger: [{ Group: "Blush", Name: "Low", Timer: 10 }], Visible: false }, { Name: "EggVibePlugXXL", Effect: ["IsPlugged", "Egged"], Value: 90, Prerequisite: ["AccessButt"], Time: 10, ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }], Visible: false }, { Name: "LockingVibePlug", Effect: ["IsPlugged", "Egged"], Value: 80, Difficulty: 30, Time: 30, RemoveTime: 50, IsRestraint: true, AllowLock: true, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Group: "Blush", Name: "High", Timer: 10 }], Visible: false }, - { Name: "ShockPlug", Fetish: ["Masochism"], Value: 60, Time: 10, Visible: false, Extended: true, AlwaysExtend: true, Prerequisite: ["AccessButt"], Effect: ["IsPlugged"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }], AllowActivity: ["ShockItem"] }, + { Name: "ShockPlug", Fetish: ["Masochism"], Value: 60, Time: 10, Visible: false, Extended: true, AlwaysExtend: true, Prerequisite: ["AccessButt"], Effect: ["IsPlugged"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, { Name: "Cowtail", Fetish: ["Pet"], BuyGroup: "CowTails", Value: 20, Time: 10, Top: 80, Prerequisite: ["AccessButt"], AllowPose: ["AllFours"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, { Name: "HollowButtPlug", Value: 15, Time: 10, Visible: false, Prerequisite: ["AccessButt"], ExpressionTrigger: [{ Name: "Low", Group: "Blush", Timer: 10 }] }, { @@ -4675,13 +4678,18 @@ var AssetFemale3DCG = [ { Name: "SlaveCollar", Value: -1, Difficulty: 50, Time: 5, Enable: false, Random: false, OwnerOnly: true, Effect: ["Lock"], AllowBlock: ["ItemMouth", "ItemMouth2", "ItemMouth3"], AllowEffect: ["GagNormal", "FixedHead"], AllowType: ["SteelPosture", "LeatherPosture", "PetCollar", "HighCollar", "LeatherCollarBell", "LeatherCollarBow", "MaidCollar", "BatCollar", "HighSecurityCollar", "SpikeCollar", "BordelleCollar", "LeatherCorsetCollar", "StrictPostureCollar", "LatexPostureCollar", "HeartCollar", "NobleCorsetCollar", "OrnateCollar", "LoveLeatherCollar", "SlenderSteelCollar", "ShinySteelCollar", "HeartLinkChoker", "NeckRope"], Extended: true }, { Name: "ClubSlaveCollar", Value: -1, Difficulty: 50, Time: 5, Enable: false, Random: false, Effect: ["Lock"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }] }, { - Name: "ShockCollar", Fetish: ["Leather", "Masochism"], Value: 80, Difficulty: 50, Time: 15, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Effect: ["ReceiveShock", "UseRemote"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], AllowType: ["", "Blink"], Extended: true, AlwaysExtend: true, AllowActivity: ["ShockItem"], ActivityAudio: ["Shocks"], Layer: [ - { Name: "Collar", HasType: false, AllowTypes: ["", "Blink"] }, - { Name: "Light", AllowTypes: ["Blink"], HideColoring: true }, + Name: "ShockCollar", Fetish: ["Leather", "Masochism"], Value: 80, Difficulty: 50, Time: 15, + Random: false, AllowLock: true, BuyGroup: "ShockCollar", Effect: ["ReceiveShock", "UseRemote"], + ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], Extended: true, + AlwaysExtend: true, HasType: false, + Layer: [ + { Name: "Collar" }, + { Name: "Light", HideColoring: true }, ], DynamicBeforeDraw: true, DynamicScriptDraw: true, }, { - Name: "AutoShockCollar", Fetish: ["Leather", "Masochism"], Value: -1, Difficulty: 50, Time: 15, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Effect: ["ReceiveShock", "UseRemote"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], AllowType: ["", "Blink", "Sensitivity"], Extended: true, AlwaysExtend: true, AllowActivity: ["ShockItem"], ActivityAudio: ["Shocks"], Layer: [ + Name: "AutoShockCollar", Fetish: ["Leather", "Masochism"], Value: -1, Difficulty: 50, Time: 15, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Effect: ["ReceiveShock", "UseRemote"], ExpressionTrigger: [{ Name: "Soft", Group: "Eyebrows", Timer: 10 }], AllowType: ["", "Blink", "Sensitivity"], Extended: true, AlwaysExtend: true, + Layer: [ { Name: "Collar", HasType: false, AllowTypes: ["", "Blink"] }, { Name: "Light", AllowTypes: ["Blink"], HideColoring: true }, ], DynamicBeforeDraw: true, DynamicScriptDraw: true, @@ -4839,13 +4847,18 @@ var AssetFemale3DCG = [ { Name: "CollarBell", Fetish: ["Metal", "Pet"], Value: 5, Difficulty: 3, Time: 5, Random: false, AllowLock: true, Prerequisite: "Collared", Audio: "BellMedium" }, { Name: "CollarBow", Fetish: ["Lingerie"], Value: 5, Difficulty: 1, Time: 5, Random: false, Prerequisite: "Collared" }, { - Name: "CollarShockUnit", Fetish: ["Masochism"], Value: 80, Difficulty: 6, Time: 5, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Prerequisite: "Collared", Effect: ["ReceiveShock", "UseRemote"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }], AllowType: ["", "Blink"], Extended: true, AlwaysExtend: true, AllowActivity: ["ShockItem"], ActivityAudio: ["Shocks"], Layer: [ - { Name: "Unit", AllowTypes: ["", "Blink"], HasType: false }, - { Name: "Light", AllowTypes: ["Blink"], HideColoring: true }, + Name: "CollarShockUnit", Fetish: ["Masochism"], Value: 80, Difficulty: 6, Time: 5, Random: false, + AllowLock: true, BuyGroup: "ShockCollar", Prerequisite: "Collared", Effect: ["ReceiveShock", "UseRemote"], + ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }], Extended: true, AlwaysExtend: true, + HasType: false, + Layer: [ + { Name: "Unit" }, + { Name: "Light", HideColoring: true }, ], DynamicBeforeDraw: true, DynamicScriptDraw: true, }, { - Name: "CollarAutoShockUnit", Fetish: ["Masochism"], Value: -1, Difficulty: 6, Time: 5, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Prerequisite: "Collared", Effect: ["ReceiveShock", "UseRemote"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }], AllowType: ["", "Blink", "Sensitivity"], Extended: true, AlwaysExtend: true, AllowActivity: ["ShockItem"], ActivityAudio: ["Shocks"], Layer: [ + Name: "CollarAutoShockUnit", Fetish: ["Masochism"], Value: -1, Difficulty: 6, Time: 5, Random: false, AllowLock: true, BuyGroup: "ShockCollar", Prerequisite: "Collared", Effect: ["ReceiveShock", "UseRemote"], ExpressionTrigger: [{ Name: "Medium", Group: "Blush", Timer: 15 }], AllowType: ["", "Blink", "Sensitivity"], Extended: true, AlwaysExtend: true, + Layer: [ { Name: "Unit", AllowTypes: ["", "Blink"], HasType: false }, { Name: "Light", AllowTypes: ["Blink"], HideColoring: true }, ], DynamicBeforeDraw: true, DynamicScriptDraw: true, diff --git a/BondageClub/Assets/Female3DCG/Female3DCGExtended.js b/BondageClub/Assets/Female3DCG/Female3DCGExtended.js index 0b5d413d58c22038b88da541f12dbff9a9fcd127..9efbf47e4baae7b7fd8595db6f6b39a99c6f95aa 100644 --- a/BondageClub/Assets/Female3DCG/Female3DCGExtended.js +++ b/BondageClub/Assets/Female3DCG/Female3DCGExtended.js @@ -2388,6 +2388,18 @@ var AssetFemale3DCGExtended = { ], } }, // BonedNeckCorset + ShockCollar: { + Archetype: ExtendedArchetype.TYPED, + CopyConfig: { GroupName: "ItemNeckAccessories", AssetName: "CollarShockUnit" }, + Config: { + Dialog: { + Load: "ItemNeckAccessoriesCollarShockUnitSelect", + TypePrefix: "ItemNeckAccessoriesCollarShockUnit", + ChatPrefix: "ItemNeckAccessoriesCollarShockUnitSet", + NpcPrefix: "ItemNeckAccessoriesCollarShockUnit", + }, + }, + }, // ShockCollar }, // ItemNeck ItemNeckAccessories: { CustomCollarTag: { @@ -2554,6 +2566,27 @@ var AssetFemale3DCGExtended = { ], }, }, // CollarNameTagLivestock + CollarShockUnit: { + Archetype: ExtendedArchetype.TYPED, + Config: { + ChatTags: [ + CommonChatTags.ASSET_NAME, + CommonChatTags.SOURCE_CHAR, + CommonChatTags.DEST_CHAR, + ], + Options: [ + { Name: "Low", Property: { Type: null, ShockLevel: 0 } }, + { Name: "Medium", Property: { Type: "Medium", ShockLevel: 1 } }, + { Name: "High", Property: { Type: "High", ShockLevel: 2 } }, + ], + ScriptHooks: { + Draw: InventoryItemNeckAccessoriesCollarShockUnitDraw, + Click: InventoryItemNeckAccessoriesCollarShockUnitClick, + }, + DrawImages: false, + BaselineProperty: { TriggerCount: 0, ShowText: true, BlinkState: false } + }, + }, // CollarShockUnit }, // ItemNeckAccessories ItemNeckRestraints: { PetPost: { @@ -4063,6 +4096,18 @@ var AssetFemale3DCGExtended = { Archetype: ExtendedArchetype.MODULAR, CopyConfig: { GroupName: "ItemButt", AssetName: "InflVibeButtPlug" }, }, // InflatableVibeDildo + ShockDildo: { + Archetype: ExtendedArchetype.TYPED, + CopyConfig: { GroupName: "ItemNeckAccessories", AssetName: "CollarShockUnit" }, + Config: { + Dialog: { + Load: "ItemNeckAccessoriesCollarShockUnitSelect", + TypePrefix: "ItemNeckAccessoriesCollarShockUnit", + ChatPrefix: "ItemNeckAccessoriesCollarShockUnitSet", + NpcPrefix: "ItemNeckAccessoriesCollarShockUnit", + }, + }, + }, // ShockDildo }, // ItemVulva ItemVulvaPiercings: { ClitRing: { @@ -4352,6 +4397,18 @@ var AssetFemale3DCGExtended = { }, }, }, // InflVibeButtPlug + ShockPlug: { + Archetype: ExtendedArchetype.TYPED, + CopyConfig: { GroupName: "ItemNeckAccessories", AssetName: "CollarShockUnit" }, + Config: { + Dialog: { + Load: "ItemNeckAccessoriesCollarShockUnitSelect", + TypePrefix: "ItemNeckAccessoriesCollarShockUnit", + ChatPrefix: "ItemNeckAccessoriesCollarShockUnitSet", + NpcPrefix: "ItemNeckAccessoriesCollarShockUnit", + }, + }, + }, // ShockPlug }, // ItemButt ItemNipplesPiercings: { RoundPiercing: { @@ -4571,6 +4628,18 @@ var AssetFemale3DCGExtended = { TapedVibeEggs: { Archetype: ExtendedArchetype.VIBRATING, }, // TapedVibeEggs + ShockClamps: { + Archetype: ExtendedArchetype.TYPED, + CopyConfig: { GroupName: "ItemNeckAccessories", AssetName: "CollarShockUnit" }, + Config: { + Dialog: { + Load: "ItemNeckAccessoriesCollarShockUnitSelect", + TypePrefix: "ItemNeckAccessoriesCollarShockUnit", + ChatPrefix: "ItemNeckAccessoriesCollarShockUnitSet", + NpcPrefix: "ItemNeckAccessoriesCollarShockUnit", + }, + }, + }, // ShockClamps }, // ItemNipples Corset: { LatexCorset1: { @@ -6827,6 +6896,7 @@ var AssetFemale3DCGExtended = { }, Dialog: { ChatPrefix: ({previousOption, newOption}) => { + // @ts-ignore const Prefix = `${DialogFocusItem.Asset.Group.Name}${DialogFocusItem.Asset.Name}Set`; const IntensityPattern = /^(i)(\d+)$/g; if (!IntensityPattern.test(newOption.Name)) { diff --git a/BondageClub/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Lock.png b/BondageClub/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Lock.png deleted file mode 100644 index 317a745dcb602aa487dc92b8d1a66a621ca26fa3..0000000000000000000000000000000000000000 Binary files a/BondageClub/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Lock.png and /dev/null differ diff --git a/BondageClub/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Light.png b/BondageClub/Assets/Female3DCG/ItemNeck/ShockCollar_Light.png similarity index 100% rename from BondageClub/Assets/Female3DCG/ItemNeck/ShockCollarBlink_Light.png rename to BondageClub/Assets/Female3DCG/ItemNeck/ShockCollar_Light.png diff --git a/BondageClub/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Lock.png b/BondageClub/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Lock.png deleted file mode 100644 index 069752301edc793e10a80fa2e8b2a94ddf1b27da..0000000000000000000000000000000000000000 Binary files a/BondageClub/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Lock.png and /dev/null differ diff --git a/BondageClub/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Light.png b/BondageClub/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnit_Light.png similarity index 100% rename from BondageClub/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnitBlink_Light.png rename to BondageClub/Assets/Female3DCG/ItemNeckAccessories/CollarShockUnit_Light.png diff --git a/BondageClub/Screens/Character/Player/Dialog_Player.csv b/BondageClub/Screens/Character/Player/Dialog_Player.csv index f34c864416efb38e6ddeb6269fd4093ce069f735..bc99d2089dfc9c9c31b937c351f7f1659de63360 100644 --- a/BondageClub/Screens/Character/Player/Dialog_Player.csv +++ b/BondageClub/Screens/Character/Player/Dialog_Player.csv @@ -663,7 +663,6 @@ FuturisticVibratorShock,,,Trigger Shock,, FuturisticVibratorSaveVoiceCommands,,,Save Voice Commands,, FuturisticVibratorSaveVoiceCommandsAction,,,SourceCharacter changes the voice command settings on DestinationCharacter FocusAssetGroup.,, FuturisticVibratorChange,,,DestinationCharacterName vibrator switches modes!,, -FuturisticVibratorShockTrigger,,,DestinationCharacterName vibrator lets out a sharp jolt!,, FuturisticVibratorPermissions,,,Anyone,, FuturisticVibratorPermissionsProhibitSelf,,,Others,, FuturisticVibratorPermissionsLockMember,,,Lock Member,, @@ -1641,7 +1640,7 @@ ObedienceBeltShockTrigger,,,The obedience belt on SourceCharacter shocks her.,, ObedienceBeltShockOrgasm,,,The obedience belt on SourceCharacter shocks her for having an orgasm.,, ObedienceBeltShockStandup,,,The obedience belt on SourceCharacter shocks her for standing up.,, ResetShockCount,,,Reset trigger count,, -ShockCount,,,Trigger count: ShockCount,, +ShockCount,,,Trigger count:,, ShockCountReset,,,SourceCharacter resets DestinationCharacter AssetName trigger count.,, Intensity,,,Intensity:,, Intensity-1,,,Item intensity: Disabled,, @@ -1669,9 +1668,13 @@ CrotchShield,,,Crotch shield:,, Increase,,,Increase,, Decrease,,,Decrease,, ShowMessageInChat,,,Show chat message,, -ShockCollarSet0,,,SourceCharacter sets DestinationCharacter AssetName to low intensity.,, -ShockCollarSet1,,,SourceCharacter sets DestinationCharacter AssetName to moderate intensity.,, -ShockCollarSet2,,,SourceCharacter sets DestinationCharacter AssetName to high intensity.,, +ItemNeckAccessoriesCollarShockUnitSelect,,,Select shock intensity,, +ItemNeckAccessoriesCollarShockUnitLow,,,Low,, +ItemNeckAccessoriesCollarShockUnitMedium,,,Medium,, +ItemNeckAccessoriesCollarShockUnitHigh,,,High,, +ItemNeckAccessoriesCollarShockUnitSetLow,,,SourceCharacter sets DestinationCharacter AssetName to low intensity.,, +ItemNeckAccessoriesCollarShockUnitSetMedium,,,SourceCharacter sets DestinationCharacter AssetName to moderate intensity.,, +ItemNeckAccessoriesCollarShockUnitSetHigh,,,SourceCharacter sets DestinationCharacter AssetName to high intensity.,, ShockCollarSetSensitivity0,,,SourceCharacter sets DestinationCharacter AssetName to manual mode.,, ShockCollarSetSensitivity1,,,SourceCharacter sets DestinationCharacter AssetName to low sensitivity.,, ShockCollarSetSensitivity2,,,SourceCharacter sets DestinationCharacter AssetName to medium sensitivity.,, @@ -2004,9 +2007,6 @@ LoveChastityBeltVibeDecreaseTo2,,,DestinationCharacterName love chastity belt sl LoveChastityBeltShockSet0,,,SourceCharacter sets DestinationCharacter love chastity belt to low intensity.,, LoveChastityBeltShockSet1,,,SourceCharacter sets DestinationCharacter love chastity belt to moderate intensity.,, LoveChastityBeltShockSet2,,,SourceCharacter sets DestinationCharacter love chastity belt to high intensity.,, -LoveChastityBeltShockTrigger0,,,DestinationCharacterName love chastity belt gives TargetPronounObject a light shock.,, -LoveChastityBeltShockTrigger1,,,DestinationCharacterName love chastity belt lets out a sharp jolt!,, -LoveChastityBeltShockTrigger2,,,DestinationCharacterName love chastity belt delivers an intense shock!,, LoveChastityBeltRemoveShieldMessage,,,SourceCharacter removes shield from DestinationCharacter love chastity belt.,, LoveChastityBeltAddShieldMessage,,,SourceCharacter locks shield to DestinationCharacter love chastity belt.,, LoveChastityBeltAddVibeMessage,,,SourceCharacter locks vibe to DestinationCharacter love chastity belt.,, @@ -2053,9 +2053,6 @@ ItemPelvisSciFiPleasurePantiesSeto2,,,"The denial mode on DestinationCharacter s ItemPelvisSciFiPleasurePantiesSets0,,,DestinationCharacter sci-fi pleasure panties are set to shock level 1.,, ItemPelvisSciFiPleasurePantiesSets1,,,DestinationCharacter sci-fi pleasure panties are set to shock level 2.,, ItemPelvisSciFiPleasurePantiesSets2,,,DestinationCharacter sci-fi pleasure panties are set to shock level 3.,, -ItemPelvisSciFiPleasurePantiesSetShockTrigger0,,,DestinationCharacter sci-fi pleasure panties gives TargetPronounObject a light shock.,, -ItemPelvisSciFiPleasurePantiesSetShockTrigger1,,,DestinationCharacter sci-fi pleasure panties lets out a sharp jolt!,, -ItemPelvisSciFiPleasurePantiesSetShockTrigger2,,,DestinationCharacter sci-fi pleasure panties delivers an intense shock!,, CustomTagText,,,Save text,, ItemNeckAccessoriesCustomCollarTagSelectBase,,,Select a module.,, ItemNeckAccessoriesCustomCollarTagSelectTag,,,Configure the tag.,, diff --git a/BondageClub/Screens/Inventory/ItemArms/PrisonLockdownSuit/PrisonLockdownSuit.js b/BondageClub/Screens/Inventory/ItemArms/PrisonLockdownSuit/PrisonLockdownSuit.js index c16dc004ed68b02532fb8879856af7d2501cdb5a..d0a1e48aa41af37860b8a0783eea18507181ff85 100644 --- a/BondageClub/Screens/Inventory/ItemArms/PrisonLockdownSuit/PrisonLockdownSuit.js +++ b/BondageClub/Screens/Inventory/ItemArms/PrisonLockdownSuit/PrisonLockdownSuit.js @@ -16,11 +16,11 @@ function InventoryItemArmsPrisonLockdownSuitShockModule1Draw() { // Catches the item extension clicks function InventoryItemArmsPrisonLockdownSuitShockModule1Click() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); - // Exits the screen if (MouseIn(1885, 25, 90, 90)) { InventoryItemArmsPrisonLockdownSuitShockModule1Exit(); + } else { + InventoryItemNeckAccessoriesCollarShockUnitClick(); } } diff --git a/BondageClub/Screens/Inventory/ItemButt/ShockPlug/ShockPlug.js b/BondageClub/Screens/Inventory/ItemButt/ShockPlug/ShockPlug.js deleted file mode 100644 index 68159033f7cd511ed764cbb258da1e3dff96d2ec..0000000000000000000000000000000000000000 --- a/BondageClub/Screens/Inventory/ItemButt/ShockPlug/ShockPlug.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemButtShockPlugLoad() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemButtShockPlugDraw() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemButtShockPlugClick() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} \ No newline at end of file diff --git a/BondageClub/Screens/Inventory/ItemMouth/FuturisticHarnessBallGag/FuturisticHarnessBallGag.js b/BondageClub/Screens/Inventory/ItemMouth/FuturisticHarnessBallGag/FuturisticHarnessBallGag.js index 2f27e328752ed3facc4ad1715657762b1c43fe71..c50cc133c38a398b384caceb310193497f0fb79a 100644 --- a/BondageClub/Screens/Inventory/ItemMouth/FuturisticHarnessBallGag/FuturisticHarnessBallGag.js +++ b/BondageClub/Screens/Inventory/ItemMouth/FuturisticHarnessBallGag/FuturisticHarnessBallGag.js @@ -42,7 +42,7 @@ function InventoryItemMouthFuturisticHarnessBallGagLoad() { if (DialogFocusItem.Property.AutoPunishUndoTimeSetting == null) DialogFocusItem.Property.AutoPunishUndoTimeSetting = 300000; if (DialogFocusItem.Property.OriginalSetting == null) DialogFocusItem.Property.OriginalSetting = null; if (DialogFocusItem.Property.ChatMessage == null) DialogFocusItem.Property.ChatMessage = true; - if (DialogFocusItem.Property.BlinkState == null) DialogFocusItem.Property.BlinkState = 0; + if (DialogFocusItem.Property.BlinkState == null) DialogFocusItem.Property.BlinkState = false; } } @@ -200,7 +200,7 @@ function AssetsItemMouthFuturisticHarnessBallGagScriptDraw(data) { var property = (data.Item.Property = data.Item.Property || {}); if (typeof persistentData.UpdateTime !== "number") persistentData.UpdateTime = CommonTime() + 4000; if (typeof persistentData.LastMessageLen !== "number") persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - if (typeof property.BlinkState !== "number") property.BlinkState = 0; + if (typeof property.BlinkState !== "boolean") property.BlinkState = false; if (ChatRoomLastMessage && ChatRoomLastMessage.length != persistentData.LastMessageLen && data.Item && data.Item.Property && data.Item.Property.Sensitivity > 0) persistentData.ChangeTime = Math.min(persistentData.ChangeTime, CommonTime() + 400); // Trigger shortly after if the user speaks @@ -213,7 +213,7 @@ function AssetsItemMouthFuturisticHarnessBallGagScriptDraw(data) { persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; } - property.BlinkState = (property.BlinkState + 1) % 2; + property.BlinkState = !property.BlinkState; var timeToNextRefresh = 3025; persistentData.UpdateTime = CommonTime() + timeToNextRefresh; diff --git a/BondageClub/Screens/Inventory/ItemMouth/FuturisticPanelGag/FuturisticPanelGag.js b/BondageClub/Screens/Inventory/ItemMouth/FuturisticPanelGag/FuturisticPanelGag.js index 72c823ec58912b21d77f095edf6cc14b97b8d234..bc24356fcc693b65f206098d038dcc50ee08ea78 100644 --- a/BondageClub/Screens/Inventory/ItemMouth/FuturisticPanelGag/FuturisticPanelGag.js +++ b/BondageClub/Screens/Inventory/ItemMouth/FuturisticPanelGag/FuturisticPanelGag.js @@ -71,7 +71,7 @@ function InventoryItemMouthFuturisticPanelGagLoad() { if (DialogFocusItem.Property.AutoPunishUndoTimeSetting == null) DialogFocusItem.Property.AutoPunishUndoTimeSetting = 300000; if (DialogFocusItem.Property.OriginalSetting == null) DialogFocusItem.Property.OriginalSetting = null; if (DialogFocusItem.Property.ChatMessage == null) DialogFocusItem.Property.ChatMessage = true; - if (DialogFocusItem.Property.BlinkState == null) DialogFocusItem.Property.BlinkState = 0; + if (DialogFocusItem.Property.BlinkState == null) DialogFocusItem.Property.BlinkState = false; } } @@ -382,7 +382,7 @@ function AssetsItemMouthFuturisticPanelGagScriptDraw(data) { var property = (data.Item.Property = data.Item.Property || {}); if (typeof persistentData.UpdateTime !== "number") persistentData.UpdateTime = CommonTime() + 4000; if (typeof persistentData.LastMessageLen !== "number") persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; - if (typeof property.BlinkState !== "number") property.BlinkState = 0; + if (typeof property.BlinkState !== "boolean") property.BlinkState = false; if (ChatRoomLastMessage && ChatRoomLastMessage.length != persistentData.LastMessageLen && data.Item && data.Item.Property && data.Item.Property.Sensitivity > 0) persistentData.ChangeTime = Math.min(persistentData.ChangeTime, CommonTime() + 400); // Trigger shortly after if the user speaks @@ -395,7 +395,7 @@ function AssetsItemMouthFuturisticPanelGagScriptDraw(data) { persistentData.LastMessageLen = (ChatRoomLastMessage) ? ChatRoomLastMessage.length : 0; } - property.BlinkState = (property.BlinkState + 1) % 2; + property.BlinkState = !property.BlinkState; var timeToNextRefresh = 3025; persistentData.UpdateTime = CommonTime() + timeToNextRefresh; @@ -407,7 +407,7 @@ function AssetsItemMouthFuturisticPanelGagScriptDraw(data) { /** @type {DynamicBeforeDrawCallback} */ function AssetsItemMouthFuturisticPanelGagBeforeDraw(data) { - if (data.L === "_Light" && data.Property && data.Property.AutoPunish > 0 && data.Property.BlinkState == 1) { + if (data.L === "_Light" && data.Property && data.Property.AutoPunish > 0 && data.Property.BlinkState) { if (data.Color && data.Color != "" && data.Color != "Default") {return {LayerType : "Blink"};} else if (data.Property.AutoPunish == 1) {return {LayerType : "Blink", Color : "#28ff28"};} diff --git a/BondageClub/Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js b/BondageClub/Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js index 5385ce4c5d8ea004adde01c5f1251eedfcdeee88..da7ba45d4265d07dbd75f37859b15ea576f5c612 100644 --- a/BondageClub/Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js +++ b/BondageClub/Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js @@ -1,20 +1,5 @@ "use strict"; -// Loads the item extension properties -function InventoryItemNeckShockCollarLoad() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemNeckShockCollarDraw() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemNeckShockCollarClick() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} - /** @type {DynamicBeforeDrawCallback} */ function AssetsItemNeckShockCollarBeforeDraw(data) { return AssetsItemNeckAccessoriesCollarShockUnitBeforeDraw(data); diff --git a/BondageClub/Screens/Inventory/ItemNeck/TechnoCollar/TechnoCollar.js b/BondageClub/Screens/Inventory/ItemNeck/TechnoCollar/TechnoCollar.js index 1fcdf9c2999c51f78ccbada2911c701d345945a9..70499c5375d8ae74c80471843fedcd1f411ed129 100644 --- a/BondageClub/Screens/Inventory/ItemNeck/TechnoCollar/TechnoCollar.js +++ b/BondageClub/Screens/Inventory/ItemNeck/TechnoCollar/TechnoCollar.js @@ -16,11 +16,11 @@ function InventoryItemNeckTechnoCollarShockModule1Draw() { // Catches the item extension clicks function InventoryItemNeckTechnoCollarShockModule1Click() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); - // Exits the screen if (MouseIn(1885, 25, 90, 90)) { InventoryItemNeckTechnoCollarShockModule1Exit(); + } else { + InventoryItemNeckAccessoriesCollarShockUnitClick(); } } diff --git a/BondageClub/Screens/Inventory/ItemNeckAccessories/CollarAutoShockUnit/CollarAutoShockUnit.js b/BondageClub/Screens/Inventory/ItemNeckAccessories/CollarAutoShockUnit/CollarAutoShockUnit.js index 35671105aae2cbd61fc2bb9bfbe459af42c5277b..1910b11fc4555bd2dc5a9ed30fc2cd55ac3d10b0 100644 --- a/BondageClub/Screens/Inventory/ItemNeckAccessories/CollarAutoShockUnit/CollarAutoShockUnit.js +++ b/BondageClub/Screens/Inventory/ItemNeckAccessories/CollarAutoShockUnit/CollarAutoShockUnit.js @@ -47,7 +47,7 @@ function InventoryItemNeckAccessoriesCollarAutoShockUnitClick() { if ((MouseIn(1500, 700, 150, 55)) && (DialogFocusItem.Property.Sensitivity != 2)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetSensitivity(2 - DialogFocusItem.Property.Sensitivity); if ((MouseIn(1700, 700, 150, 55)) && (DialogFocusItem.Property.Sensitivity != 3)) InventoryItemNeckAccessoriesCollarAutoShockUnitSetSensitivity(3 - DialogFocusItem.Property.Sensitivity); - if (Player.CanInteract() && (MouseX >= 1600) && (MouseX <= 1800) && (MouseY >= 790) && (MouseY <= 845)) InventoryItemNeckAccessoriesCollarAutoShockUnitTrigger(); + if (Player.CanInteract() && (MouseX >= 1600) && (MouseX <= 1800) && (MouseY >= 790) && (MouseY <= 845)) ExtendedItemShockPublishAction(); } // Sets the shock collar intensity @@ -61,12 +61,13 @@ function InventoryItemNeckAccessoriesCollarAutoShockUnitSetIntensity(Modifier) { } DialogFocusItem.Property.ShockLevel = DialogFocusItem.Property.ShockLevel + Modifier; + const LevelRecord = { 0: "Low", 1: "Medium", 2: "High" }; if (DialogFocusItem.Property.ShowText) { var Dictionary = []; Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); Dictionary.push({Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - ChatRoomPublishCustomAction("ShockCollarSet" + DialogFocusItem.Property.ShockLevel, true, Dictionary); + ChatRoomPublishCustomAction(`ItemNeckAccessoriesCollarShockUnitSet${LevelRecord[DialogFocusItem.Property.ShockLevel]}`, true, Dictionary); } else DialogLeave(); @@ -150,60 +151,10 @@ function InventoryItemNeckAccessoriesCollarAutoShockUnitUpdate(data) { } if (ShockTriggerPunish) { - InventoryItemNeckAccessoriesCollarAutoShockUnitTriggerAutomatic(data); + ExtendedItemShockPublishAction(data.C, Item, true); ChatRoomCharacterUpdate(Player); } } - - -} - -// Trigger a shock outside of the dialog menu -function InventoryItemNeckAccessoriesCollarAutoShockUnitTriggerAutomatic(data) { - var msg = "TriggerShock" + data.Item.Property.ShockLevel; - var C = data.C; - - - if (CurrentScreen == "ChatRoom" && data.Item.Property.ShowText) { - var Dictionary = [ - { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { Tag: "AssetName", AssetName: data.Item.Asset.Name }, - { ShockIntensity : data.Item.Property.ShockLevel * 1.5}, - ]; - ServerSend("ChatRoomChat", { Content: msg, Type: "Action", Dictionary }); - ChatRoomCharacterItemUpdate(C, data.Item.Asset.Group.Name); - } - - InventoryShockExpression(C); -} - -// Trigger a shock from the dialog menu -function InventoryItemNeckAccessoriesCollarAutoShockUnitTrigger(data) { - // Gets the current item and character - var C = CharacterGetCurrent(); - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarAutoShockUnitLoad(); - } - - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - Dictionary.push({ Tag: "ActivityName", Text: "ShockItem" }); - Dictionary.push({ Tag: "ActivityGroup", Text: DialogFocusItem.Asset.Group.Name }); - Dictionary.push({ AssetName: DialogFocusItem.Asset.Name }); - Dictionary.push({ AssetGroupName: DialogFocusItem.Asset.Group.Name }); - - if (C.ID == Player.ID) { - // The Player shocks herself - ActivityArousalItem(C, C, DialogFocusItem.Asset); - } - - ChatRoomPublishCustomAction("TriggerShock" + DialogFocusItem.Property.ShockLevel, true, Dictionary); - - InventoryShockExpression(C); } /** @type {DynamicBeforeDrawCallback} */ diff --git a/BondageClub/Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js b/BondageClub/Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js index a74ba65e3afdd3ab95bd6a617cb04bbd9e33a0ee..ba761f14cb1f81bc84726f0738d7e8bc368b75b5 100644 --- a/BondageClub/Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js +++ b/BondageClub/Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js @@ -1,192 +1,101 @@ "use strict"; -// Loads the item extension properties -function InventoryItemNeckAccessoriesCollarShockUnitLoad() { - if (DialogFocusItem.Property == null) DialogFocusItem.Property = { Intensity: 0, ShowText: true }; - if (DialogFocusItem.Property.ShockLevel == null) DialogFocusItem.Property.ShockLevel = 0; - if (DialogFocusItem.Property.TriggerCount == null) DialogFocusItem.Property.TriggerCount = 0; - if (DialogFocusItem.Property.ShowText == null) DialogFocusItem.Property.ShowText = true; -} - -// Draw the item extension screen -function InventoryItemNeckAccessoriesCollarShockUnitDraw() { - DrawAssetPreview(1387, 225, DialogFocusItem.Asset); - DrawText(DialogFindPlayer("Intensity" + DialogFocusItem.Property.ShockLevel.toString()).replace("Item", DialogFocusItem.Asset.Description), 1500, 550, "White", "Gray"); - DrawText(DialogFindPlayer("ShockCount").replace("ShockCount", DialogFocusItem.Property.TriggerCount), 1500, 600, "White", "Gray"); - DrawButton(1200, 650, 200, 55, DialogFindPlayer("Low"), DialogFocusItem.Property.ShockLevel > 0 ? "White" : "Gray"); - DrawButton(1550, 650, 200, 55, DialogFindPlayer("Medium"), (DialogFocusItem.Property.ShockLevel < 1 || DialogFocusItem.Property.ShockLevel > 1) ? "White" : "Gray"); - DrawButton(1375, 710, 200, 55, DialogFindPlayer("High"), DialogFocusItem.Property.ShockLevel < 2 ? "White" : "Gray"); - if (CurrentScreen == "ChatRoom") DrawButton(1325, 800, 64, 64, "", "White", DialogFocusItem.Property.ShowText ? "Icons/Checked.png" : ""); - if (CurrentScreen == "ChatRoom") DrawText(DialogFindPlayer("ShowMessageInChat"), 1570, 833, "White", "Gray"); - DrawButton(1250, 900, 200, 55, DialogFindPlayer("ResetShockCount"), Player.CanInteract() && DialogFocusItem.Property.TriggerCount > 0 ? "White" : "Gray"); - DrawButton(1500, 900, 200, 55, DialogFindPlayer("TriggerShock"), Player.CanInteract() ? "White" : "Gray"); +/** + * Draw the item extension screen + * @param {() => void} OriginalFunction - The function that is normally called when an archetypical item reaches this point. + * @returns {void} Nothing + */ +function InventoryItemNeckAccessoriesCollarShockUnitDraw(OriginalFunction) { + OriginalFunction(); + + MainCanvas.textAlign = "right"; + DrawText(DialogFindPlayer("ShockCount"), 1500, 575, "White", "Gray"); + MainCanvas.textAlign = "left"; + DrawText(`${DialogFocusItem.Property.TriggerCount}`, 1510, 575, "White", "Gray"); + MainCanvas.textAlign = "center"; + + DrawCheckbox(1175, 618, 64, 64, "", DialogFocusItem.Property.ShowText, ExtendedItemPermissionMode); + DrawText(DialogFindPlayer("ShowMessageInChat"), 1420, 648, "White", "Gray"); + ExtendedItemCustomDraw("ResetShockCount", 1635, 550); + ExtendedItemCustomDraw("TriggerShock", 1635, 625); } -// Catches the item extension clicks -function InventoryItemNeckAccessoriesCollarShockUnitClick() { - if (MouseIn(1325, 800, 64, 64) && (CurrentScreen == "ChatRoom")) { - DialogFocusItem.Property.ShowText = !DialogFocusItem.Property.ShowText; - return; - } - - if (MouseIn(1200, 650, 200, 55) && (DialogFocusItem.Property.ShockLevel > 0)) { - InventoryItemNeckAccessoriesCollarShockUnitSetIntensity(0 - DialogFocusItem.Property.ShockLevel); - return; - } - - if (MouseIn(1550, 650, 200, 55) && (DialogFocusItem.Property.ShockLevel < 1 || DialogFocusItem.Property.ShockLevel > 1)) { - InventoryItemNeckAccessoriesCollarShockUnitSetIntensity(1 - DialogFocusItem.Property.ShockLevel); - return; - } - - if (MouseIn(1375, 710, 200, 55) && (DialogFocusItem.Property.ShockLevel < 2)) { - InventoryItemNeckAccessoriesCollarShockUnitSetIntensity(2 - DialogFocusItem.Property.ShockLevel); - return; - } - - if (Player.CanInteract() && MouseIn(1500, 900, 200, 55)) { - InventoryItemNeckAccessoriesCollarShockUnitTrigger(); - return; - } +/** + * Catches the item extension clicks + * @param {() => void} OriginalFunction - The function that is normally called when an archetypical item reaches this point. + * @returns {void} Nothing + */ +function InventoryItemNeckAccessoriesCollarShockUnitClick(OriginalFunction) { + OriginalFunction(); - if (Player.CanInteract() && DialogFocusItem.Property.TriggerCount > 0 && MouseIn(1250, 900, 200, 55)) { - InventoryItemNeckAccessoriesCollarShockUnitResetCount(); + if (!DialogFocusItem) { return; + } else if (MouseIn(1175, 618, 64, 64) && !ExtendedItemPermissionMode) { + DialogFocusItem.Property.ShowText = !DialogFocusItem.Property.ShowText; + } else if (MouseIn(1635, 550, 225, 55)) { + ExtendedItemCustomClick("ResetShockCount", InventoryItemNeckAccessoriesCollarShockUnitResetCount); + } else if (MouseIn(1635, 625, 225, 55)) { + ExtendedItemCustomClick("TriggerShock", ExtendedItemShockPublishAction); } - - if ((MouseX >= 1885) && (MouseX <= 1975) && (MouseY >= 25) && (MouseY <= 110)) DialogFocusItem = null; } // Resets the trigger count function InventoryItemNeckAccessoriesCollarShockUnitResetCount() { // Gets the current item and character - var C = CharacterGetCurrent(); - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarShockUnitLoad(); - } - DialogFocusItem.Property.TriggerCount = 0; + const C = CharacterGetCurrent(); + const Dictionary = [ + { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, + { Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }, + { Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name }, + ]; - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name }); - Dictionary.push({ AssetName: DialogFocusItem.Asset.Name }); - Dictionary.push({ AssetGroupName: DialogFocusItem.Asset.Group.Name }); - - ChatRoomPublishCustomAction("ShockCountReset", false, Dictionary); - -} - -// Sets the shock collar intensity -function InventoryItemNeckAccessoriesCollarShockUnitSetIntensity(Modifier) { - - // Gets the current item and character - var C = CharacterGetCurrent(); - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarShockUnitLoad(); - } - - DialogFocusItem.Property.ShockLevel = DialogFocusItem.Property.ShockLevel + Modifier; if (DialogFocusItem.Property.ShowText) { - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - ChatRoomPublishCustomAction("ShockCollarSet" + DialogFocusItem.Property.ShockLevel, true, Dictionary); - } - else - DialogLeave(); - -} - -// Trigger a shock from the dialog menu -function InventoryItemNeckAccessoriesCollarShockUnitTrigger() { - // Gets the current item and character - var C = CharacterGetCurrent(); - if ((CurrentScreen == "ChatRoom") || (DialogFocusItem == null)) { - DialogFocusItem = InventoryGet(C, C.FocusGroup.Name); - InventoryItemNeckAccessoriesCollarShockUnitLoad(); - } - - DialogFocusItem.Property.TriggerCount++; - - /** @type {ChatMessageDictionary} */ - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: DialogFocusItem.Asset.Name}); - Dictionary.push({ Tag: "ActivityName", Text: "ShockItem" }); - Dictionary.push({ Tag: "ActivityGroup", Text: DialogFocusItem.Asset.Group.Name }); - Dictionary.push({ ShockIntensity : DialogFocusItem.Property.ShockLevel * 1.5}); - Dictionary.push({ AssetName: DialogFocusItem.Asset.Name }); - Dictionary.push({ AssetGroupName: DialogFocusItem.Asset.Group.Name }); - - ChatRoomPublishCustomAction("TriggerShock" + DialogFocusItem.Property.ShockLevel, false, Dictionary); - - if (C.ID == Player.ID) { - // The Player shocks herself - ActivityArousalItem(C, C, DialogFocusItem.Asset); + ChatRoomPublishCustomAction("ShockCountReset", false, Dictionary); } - if (CurrentScreen == "ChatRoom") - DialogLeave(); - - InventoryShockExpression(C); } /** @type {DynamicBeforeDrawCallback} */ function AssetsItemNeckAccessoriesCollarShockUnitBeforeDraw(data) { if (data.L === "_Light") { - var persistentData = data.PersistentData(); - var property = data.Property || {}; - var Triggered = persistentData.LastTriggerCount < property.TriggerCount; - var intensity = property.ShockLevel ? property.ShockLevel : 0; - var wasBlinking = property.Type === "Blink"; + /** @type {{ChangeTime?: number, DisplayCount?: number, LastTriggerCount?: number}} */ + const persistentData = data.PersistentData(); + const property = data.Property || {}; + const Triggered = persistentData.LastTriggerCount < property.TriggerCount; + const intensity = property.ShockLevel || 0; + const wasBlinking = property.BlinkState; if (wasBlinking && Triggered) persistentData.DisplayCount++; if (persistentData.DisplayCount >= intensity * 1.5 + 3) { persistentData.DisplayCount = 0; persistentData.LastTriggerCount = property.TriggerCount; } - return { Color: Triggered ? "#f00" : "#2f0" }; + return { Color: Triggered ? "#f00" : "#2f0", Opacity: wasBlinking ? 0 : 1 }; } } /** @type {DynamicScriptDrawCallback} */ function AssetsItemNeckAccessoriesCollarShockUnitScriptDraw(data) { - var persistentData = data.PersistentData(); + /** @type {{ChangeTime?: number, DisplayCount?: number, LastTriggerCount?: number}} */ + const persistentData = data.PersistentData(); /** @type {ItemProperties} */ - var property = (data.Item.Property = data.Item.Property || {}); + const property = (data.Item.Property = data.Item.Property || {}); if (typeof persistentData.ChangeTime !== "number") persistentData.ChangeTime = CommonTime() + 4000; if (typeof persistentData.DisplayCount !== "number") persistentData.DisplayCount = 0; if (typeof persistentData.LastTriggerCount !== "number") persistentData.LastTriggerCount = property.TriggerCount; - - var isTriggered = persistentData.LastTriggerCount < property.TriggerCount; - var newlyTriggered = isTriggered && persistentData.DisplayCount == 0; + const isTriggered = persistentData.LastTriggerCount < property.TriggerCount; + const newlyTriggered = isTriggered && persistentData.DisplayCount == 0; if (newlyTriggered) persistentData.ChangeTime = Math.min(persistentData.ChangeTime, CommonTime()); if (persistentData.ChangeTime < CommonTime()) { if (persistentData.LastTriggerCount > property.TriggerCount) persistentData.LastTriggerCount = 0; - var wasBlinking = property.Type === "Blink"; - property.Type = wasBlinking && !newlyTriggered ? null : "Blink"; - var timeFactor = isTriggered ? 12 : 1; - var timeToNextRefresh = (wasBlinking ? 4000 : 1000) / timeFactor; + const wasBlinking = property.BlinkState; + property.BlinkState = wasBlinking && !newlyTriggered ? false : true; + const timeFactor = isTriggered ? 12 : 1; + const timeToNextRefresh = (wasBlinking ? 4000 : 1000) / timeFactor; persistentData.ChangeTime = CommonTime() + timeToNextRefresh; AnimationRequestRefreshRate(data.C, (5000 / timeFactor) - timeToNextRefresh); AnimationRequestDraw(data.C); } } - -/** - * @returns {[string, number]} - */ -function InventoryItemNeckAccessoriesCollarShockUnitDynamicAudio(data) { - var Modifier = parseInt(data.Content.substr(data.Content.length - 1)); - if (isNaN(Modifier)) Modifier = 0; - return ["Shocks", Modifier * 3]; -} diff --git a/BondageClub/Screens/Inventory/ItemNipples/ShockClamps/ShockClamps.js b/BondageClub/Screens/Inventory/ItemNipples/ShockClamps/ShockClamps.js deleted file mode 100644 index 344838baf63b4ab942de98a00760fa46528d3cfe..0000000000000000000000000000000000000000 --- a/BondageClub/Screens/Inventory/ItemNipples/ShockClamps/ShockClamps.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemNipplesShockClampsLoad() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemNipplesShockClampsDraw() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemNipplesShockClampsClick() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} \ No newline at end of file diff --git a/BondageClub/Screens/Inventory/ItemPelvis/LoveChastityBelt/LoveChastityBelt.js b/BondageClub/Screens/Inventory/ItemPelvis/LoveChastityBelt/LoveChastityBelt.js index b35ab0e28bce5dbd5af95e6c19ba84bb5ab9ae5f..dabde366e46b5bafdf3c937a086e0f3fbd577979 100644 --- a/BondageClub/Screens/Inventory/ItemPelvis/LoveChastityBelt/LoveChastityBelt.js +++ b/BondageClub/Screens/Inventory/ItemPelvis/LoveChastityBelt/LoveChastityBelt.js @@ -72,7 +72,7 @@ function InventoryItemPelvisLoveChastityBeltClick() { if (DialogFocusItem.Property.Type == "Shock") { if (MouseIn(1200, 600, 250, 65)) { - InventoryItemPelvisLoveChastityBeltTriggerShock(); + ExtendedItemShockPublishAction(); return; } if (MouseIn(1200, 900, 64, 64) && (MouseY <= 964) && (CurrentScreen == "ChatRoom")) { @@ -183,18 +183,6 @@ function InventoryItemPelvisLoveChastityBeltIntensityCanDecrease() { } } -// triggers the shock -function InventoryItemPelvisLoveChastityBeltTriggerShock() { - InventoryItemPelvisLoveChastityBeltLastAction = "ShockTriggered"; - InventoryExpressionTrigger(CharacterGetCurrent(), DialogFocusItem); - var Dictionary = []; - Dictionary.push({Tag: "DestinationCharacterName", Text: CharacterNickname(CharacterGetCurrent()), MemberNumber: CharacterGetCurrent().MemberNumber}); - Dictionary.push({Tag: "SourceCharacter", Text: CharacterNickname(Player), MemberNumber: Player.MemberNumber}); - Dictionary.push({ ShockIntensity : DialogFocusItem.Property.ShockLevel * 1.5}); - - ChatRoomPublishCustomAction("LoveChastityBeltShockTrigger" + DialogFocusItem.Property.ShockLevel, true, Dictionary); -} - // loads the belt into a correct state function InventoryItemPelvisLoveChastityBeltLoadType() { if (DialogFocusItem.Property.Type == "Open") { diff --git a/BondageClub/Screens/Inventory/ItemPelvis/ObedienceBelt/ObedienceBelt.js b/BondageClub/Screens/Inventory/ItemPelvis/ObedienceBelt/ObedienceBelt.js index fe64448f750f6d1edc5f824dd97757d38f39170b..c62f337fce033a8f32511142ea5b25321f7baa30 100644 --- a/BondageClub/Screens/Inventory/ItemPelvis/ObedienceBelt/ObedienceBelt.js +++ b/BondageClub/Screens/Inventory/ItemPelvis/ObedienceBelt/ObedienceBelt.js @@ -108,7 +108,7 @@ function InventoryItemPelvisObedienceBeltShockModule1Click() { } if (MouseIn(1387, 800, 225, 55)) { - InventoryItemPelvisObedienceBeltScriptTrigger(C, DialogFocusItem, "Trigger"); + ExtendedItemShockPublishAction(); return; } } @@ -131,39 +131,6 @@ function InventoryItemPelvisObedienceBeltInit(item) { if (typeof item.Property.Text !== "string") item.Property.Text = ""; } -/** - * Trigger a shock automatically - * @param {Character} C - * @param {Item} Item - * @param {string} ShockType - */ -function InventoryItemPelvisObedienceBeltScriptTrigger(C, Item, ShockType) { - - if (!(CurrentScreen == "ChatRoom")) { - AudioPlayInstantSound("Audio/Shocks.mp3"); - } else { - const Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "SourceCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: Item.Asset.Name}); - Dictionary.push({ Tag: "ActivityName", Text: "ShockItem" }); - Dictionary.push({ Tag: "ActivityGroup", Text: Item.Asset.Group.Name }); - Dictionary.push({ AssetName: Item.Asset.Name }); - Dictionary.push({ AssetGroupName: Item.Asset.Group.Name }); - Dictionary.push({ ShockIntensity : 2}); - if (Item.Property && Item.Property.ChatMessage) { - if (ShockType !== "Trigger") - Dictionary.push({ Automatic: true }); - ServerSend("ChatRoomChat", { Content: "ObedienceBeltShock" + ShockType, Type: "Action", Dictionary }); - } else { - ChatRoomMessage({ Content: "ObedienceBeltShock" + ShockType, Type: "Action", Sender: Player.MemberNumber, Dictionary: Dictionary }); - } - } - InventoryShockExpression(C); -} - - /** * @param {Item} Item */ @@ -191,10 +158,10 @@ function AssetsItemPelvisObedienceBeltUpdate(data, LastTime) { let punishment = InventoryObedienceBeltCheckPunish(Item); switch (punishment) { case "Orgasm": - InventoryItemPelvisObedienceBeltScriptTrigger(C, Item, "Orgasm"); + ExtendedItemShockPublishAction(C, Item, true); break; case "StandUp": - InventoryItemPelvisObedienceBeltScriptTrigger(C, Item, "Standup"); + ExtendedItemShockPublishAction(C, Item, true); CharacterSetActivePose(Player, "Kneel"); ServerSend("ChatRoomCharacterPoseUpdate", { Pose: Player.ActivePose }); break; diff --git a/BondageClub/Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js b/BondageClub/Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js index 456536a06c6f606e2ec57ccaafc5242ceb5b893d..8fba10334df0b0bbd39d4091a3def113f3ab412c 100644 --- a/BondageClub/Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js +++ b/BondageClub/Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js @@ -47,35 +47,7 @@ function InventoryItemPelvisSciFiPleasurePantiesClick(OriginalFunction) { if (MouseIn(1175, 818, 64, 64) && !ExtendedItemPermissionMode) { DialogFocusItem.Property.ShowText = !DialogFocusItem.Property.ShowText; } else if (MouseIn(1637, 825, 225, 55)) { - ExtendedItemCustomClick("TriggerShock", InventoryItemPelvisSciFiPleasurePantiesShockTrigger); + ExtendedItemCustomClick("TriggerShock", ExtendedItemShockPublishAction); } } } - -/** - * Shock the wearer of the belt - * @returns {void} - Nothing - */ -function InventoryItemPelvisSciFiPleasurePantiesShockTrigger() { - const C = CharacterGetCurrent(); - if (C.ID === Player.ID) { - // The Player shocks herself - ActivityArousalItem(C, C, DialogFocusItem.Asset); - } - - const Data = ModularItemDataLookup[DialogFocusItem.Asset.Group.Name + DialogFocusItem.Asset.Name]; - const Prefix = ModularItemCustomChatPrefix("ShockTrigger", Data); - const ActionTag = `${Prefix}ShockTrigger${DialogFocusItem.Property.ShockLevel}`; - - /** @type {ChatMessageDictionary | null} */ - let Dictionary = null; - if (DialogFocusItem.Property.ShowText) { - Dictionary = [ - { Tag: "AssetName", Text: DialogFocusItem.Asset.Description.toLowerCase() }, - { Tag: "DestinationCharacter", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, - { ShockIntensity : DialogFocusItem.Property.ShockLevel * 1.5}, - ]; - } - ExtendedItemCustomExit(ActionTag, C, Dictionary); - InventoryShockExpression(C); -} diff --git a/BondageClub/Screens/Inventory/ItemVulva/FuturisticVibrator/FuturisticVibrator.js b/BondageClub/Screens/Inventory/ItemVulva/FuturisticVibrator/FuturisticVibrator.js index 3de7e713dbf5fac597df7eb6597d89873198bc21..b397bc5e1cdcd8637ac52909023da863d6010b79 100644 --- a/BondageClub/Screens/Inventory/ItemVulva/FuturisticVibrator/FuturisticVibrator.js +++ b/BondageClub/Screens/Inventory/ItemVulva/FuturisticVibrator/FuturisticVibrator.js @@ -199,23 +199,6 @@ function InventoryItemVulvaFuturisticVibratorSetMode(C, Item, Option, IgnoreSame } } -// Trigger a shock automatically -function InventoryItemVulvaFuturisticVibratorTriggerShock(C, Item) { - - if (CurrentScreen == "ChatRoom") { - /** @type {ChatMessageDictionary} */ - var Dictionary = []; - Dictionary.push({ Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }); - Dictionary.push({ Tag: "AssetName", AssetName: Item.Asset.Name}); - Dictionary.push({ ShockIntensity : 2}); - - ServerSend("ChatRoomChat", { Content: "FuturisticVibratorShockTrigger", Type: "Action", Dictionary }); - } - - InventoryShockExpression(C); -} - - function InventoryItemVulvaFuturisticVibratorHandleChat(C, Item, LastTime) { if (!Item) return; if (!Item.Property) VibratorModeSetProperty(Item, VibratorModeOptions[VibratorModeSet.STANDARD][0].Property); @@ -245,7 +228,7 @@ function InventoryItemVulvaFuturisticVibratorHandleChat(C, Item, LastTime) { else if (msg.includes("Decrease")) InventoryItemVulvaFuturisticVibratorSetMode(C, Item, VibratorModeGetOption(InventoryItemVulvaFuturisticVibratorGetMode(Item, false)), true); //triggered actions - if (msg.includes("Shock")) InventoryItemVulvaFuturisticVibratorTriggerShock(C, Item); + if (msg.includes("Shock")) ExtendedItemShockPublishAction(C, Item, true); } } } diff --git a/BondageClub/Screens/Inventory/ItemVulva/ShockDildo/ShockDildo.js b/BondageClub/Screens/Inventory/ItemVulva/ShockDildo/ShockDildo.js deleted file mode 100644 index 9c1af5749ca590bd7511fe83c37907a06735ddcf..0000000000000000000000000000000000000000 --- a/BondageClub/Screens/Inventory/ItemVulva/ShockDildo/ShockDildo.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -// Loads the item extension properties -function InventoryItemVulvaShockDildoLoad() { - InventoryItemNeckAccessoriesCollarShockUnitLoad(); -} - -// Draw the item extension screen -function InventoryItemVulvaShockDildoDraw() { - InventoryItemNeckAccessoriesCollarShockUnitDraw(); -} - -// Catches the item extension clicks -function InventoryItemVulvaShockDildoClick() { - InventoryItemNeckAccessoriesCollarShockUnitClick(); -} \ No newline at end of file diff --git a/BondageClub/Screens/Online/ChatRoom/ChatRoom.js b/BondageClub/Screens/Online/ChatRoom/ChatRoom.js index 73460f3aae50686b3f30d4e500bbfc02e32e1139..ee0bf53c3f0e96112f98be31a61432f46ab41f95 100644 --- a/BondageClub/Screens/Online/ChatRoom/ChatRoom.js +++ b/BondageClub/Screens/Online/ChatRoom/ChatRoom.js @@ -2413,8 +2413,11 @@ var ChatRoomMessageHandlers = [ intensity = metadata.ShockIntensity; } else if (data.Type === "Activity" && data.Content.includes("ShockItem")) { let item = InventoryGet(Player, metadata.ActivityGroup); - if (item && item.Property) - intensity = item.Property.Intensity || 0; + if (item && item.Property && item.Property.ShockLevel != null) { + intensity = 1.5 * item.Property.ShockLevel; + } else { + intensity = 1.5; + } } if (intensity !== null && metadata.TargetCharacter.IsPlayer()) { diff --git a/BondageClub/Scripts/Audio.js b/BondageClub/Scripts/Audio.js index 38ac58863d21eaecf2a451e250a51689a4c49c58..940e24cb9c8722d9d90179f3a2dd0ab6f02ff5c4 100644 --- a/BondageClub/Scripts/Audio.js +++ b/BondageClub/Scripts/Audio.js @@ -279,15 +279,9 @@ var AudioActions = [ }, { IsAction: (data) => [ - "CollarShockUnitTrigger", - "ShockCollarTrigger", - "LoveChastityBeltShockTrigger", - "SciFiPleasurePantiesShockTrigger", "TriggerShock", - "CollarAutoShockUnitTrigger", - "FuturisticVibratorShockTrigger" ].some(A => data.Content.includes(A)), - GetSoundEffect: (data) => InventoryItemNeckAccessoriesCollarShockUnitDynamicAudio(data) + GetSoundEffect: (data) => AudioShockSounds(data) }, { IsAction: (data) => [ @@ -583,3 +577,14 @@ function AudioVibratorSounds(data) { return [Sound, Level * 3]; } + +/** + * Processes the sound for shocks + * @param {IChatRoomMessage} data - Represents the chat message received + * @returns {[string, number]} - The name of the sound to play, followed by the noise modifier + */ + function AudioShockSounds(data) { + let Modifier = parseInt(data.Content.slice(-1)); + if (isNaN(Modifier)) Modifier = 0; + return ["Shocks", Modifier * 3]; +} diff --git a/BondageClub/Scripts/ExtendedItem.js b/BondageClub/Scripts/ExtendedItem.js index d01505e7f8778c5c4fa7932a8d059c54f29b13a2..a55124e15d3be10825f7631bde6bbbb3949c9f42 100644 --- a/BondageClub/Scripts/ExtendedItem.js +++ b/BondageClub/Scripts/ExtendedItem.js @@ -744,3 +744,65 @@ function ExtendedItemCustomExit(Name, C, Dictionary=null) { } } } + +/** + * Helper fuction for publishing shock-related actions. + * @param {Character} C - The shocked character; defaults to the {@link CharacterGetCurrent} output + * @param {Item} Item - The shocking item; defaults to {@link DialogFocusItem} + * @param {boolean} Automatic - Whether the shock was triggered automatically or otherwise manually + */ +function ExtendedItemShockPublishAction(C=null, Item=DialogFocusItem, Automatic=false) { + if (C == null) { + C = CharacterGetCurrent(); + } + if (Item == null) { + return; + } + + // Get item-specific properties and choose a suitable default if absent + const ShockLevel = (Item.Property.ShockLevel != null) ? Item.Property.ShockLevel : 1; + const ShowText = (Item.Property.ShowText != null) ? Item.Property.ShowText : true; + if (Item.Property.TriggerCount != null) { + Item.Property.TriggerCount++; + } + + if (C.ID === Player.ID) { + // The Player shocks herself + ActivityArousalItem(C, C, Item.Asset); + } + InventoryShockExpression(C); + + /** @type {ChatMessageDictionary} */ + const Dictionary = [ + { Tag: "DestinationCharacterName", Text: CharacterNickname(C), MemberNumber: C.MemberNumber }, + { Tag: "AssetName", AssetName: Item.Asset.Name }, + { ShockIntensity : ShockLevel * 1.5 }, + { AssetName: Item.Asset.Name }, + { FocusGroupName: Item.Asset.Group.Name }, + ]; + if (Automatic) { + Dictionary.push({ Automatic: true }); + } + const ActionTag = `TriggerShock${ShockLevel}`; + + // Manually play audio and flash the screen when not in a chatroom + if (CurrentScreen !== "ChatRoom") { + AudioPlaySoundEffect("Shocks", 3 + (3 * ShockLevel)); + if (C.ID === Player.ID) { + const duration = (Math.random() + ShockLevel * 1.5) * 500; + DrawFlashScreen("#FFFFFF", duration, 500); + } + } + + // Publish the action, be it either quietly or not + if (ShowText && CurrentScreen === "ChatRoom") { + ChatRoomPublishCustomAction(ActionTag, false, Dictionary); + } else if (CurrentScreen === "ChatRoom") { + ChatRoomMessage({ Content: ActionTag, Type: "Action", Sender: Player.MemberNumber, Dictionary: Dictionary }); + } + + // Exit the dialog menu when triggering a manual shock + if (!Automatic) { + ExtendedItemCustomExit(ActionTag, C, null) + } +} diff --git a/BondageClub/Scripts/Typedef.d.ts b/BondageClub/Scripts/Typedef.d.ts index 93fa9e4f798fcd7bbffdab8fe2005922bb160d2d..df92d17420b2b126e8dd468ecdff9b9881050e96 100644 --- a/BondageClub/Scripts/Typedef.d.ts +++ b/BondageClub/Scripts/Typedef.d.ts @@ -1729,7 +1729,7 @@ interface ItemPropertiesCustom { /** Whether auto-inflation should trigger a chat message */ ChatMessage?: boolean; /** Whether gag's blinking light is on or off */ - BlinkState?: 0 | 1; + BlinkState?: boolean; /** * An extended item option * @todo Investigate whether this property still actually exists diff --git a/BondageClub/Tools/Node/AssetCheck.js b/BondageClub/Tools/Node/AssetCheck.js index bf20eaa52ed450eef058ce967e0cbebb1b2f1541..58e60e5edcdbb9a4496e47fd0f7348280cff1c6f 100644 --- a/BondageClub/Tools/Node/AssetCheck.js +++ b/BondageClub/Tools/Node/AssetCheck.js @@ -20,6 +20,7 @@ const neededFiles = [ "Screens/Inventory/ItemDevices/WoodenBox/WoodenBox.js", "Screens/Inventory/ItemDevices/TransportWoodenBox/TransportWoodenBox.js", "Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js", + "Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js", "Assets/Female3DCG/Female3DCG.js", "Assets/Female3DCG/Female3DCGExtended.js" ]; diff --git a/BondageClub/index.html b/BondageClub/index.html index b35a523ca0254bdad981ee89ef45226f31aed9ab..9b712ceab46543bd64b2f74e8286844f850abbf5 100644 --- a/BondageClub/index.html +++ b/BondageClub/index.html @@ -73,6 +73,7 @@ <script src="Screens/Inventory/ItemDevices/WoodenBox/WoodenBox.js"></script> <script src="Screens/Inventory/ItemDevices/TransportWoodenBox/TransportWoodenBox.js"></script> <script src="Screens/Inventory/ItemPelvis/SciFiPleasurePanties/SciFiPleasurePanties.js"></script> +<script src="Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js"></script> <script src="Assets/Female3DCG/Female3DCGExtended.js"></script> <script src="Screens/Character/Login/Login.js"></script> <script src="Screens/Character/Appearance/Appearance.js"></script> @@ -174,7 +175,6 @@ <script src="Screens/Online/GameMagicBattle/GameMagicBattle.js"></script> <script src="Screens/Inventory/ItemNeck/ShockCollar/ShockCollar.js"></script> <script src="Screens/Inventory/ItemNeck/AutoShockCollar/AutoShockCollar.js"></script> -<script src="Screens/Inventory/ItemNeckAccessories/CollarShockUnit/CollarShockUnit.js"></script> <script src="Screens/Inventory/ItemNeckAccessories/CollarAutoShockUnit/CollarAutoShockUnit.js"></script> <script src="Screens/Inventory/ItemArms/HempRope/HempRope.js"></script> <script src="Screens/Inventory/ItemArms/NylonRope/NylonRope.js"></script> @@ -213,9 +213,6 @@ <script src="Screens/Inventory/ItemPelvis/FuturisticTrainingBelt/FuturisticTrainingBelt.js"></script> <script src="Screens/Inventory/ItemPelvis/ObedienceBelt/ObedienceBelt.js"></script> <script src="Screens/Inventory/ItemBreast/FuturisticBra/FuturisticBra.js"></script> -<script src="Screens/Inventory/ItemButt/ShockPlug/ShockPlug.js"></script> -<script src="Screens/Inventory/ItemVulva/ShockDildo/ShockDildo.js"></script> -<script src="Screens/Inventory/ItemNipples/ShockClamps/ShockClamps.js"></script> <script src="Screens/Inventory/ItemArms/PrisonLockdownSuit/PrisonLockdownSuit.js"></script> <script src="Screens/Inventory/ItemNeckAccessories/CustomCollarTag/CustomCollarTag.js"></script> <script src="Screens/Inventory/ItemNeckAccessories/ElectronicTag/ElectronicTag.js"></script>