* Shibari!

Added a new scene item, shibari bindings!
These by default only cover the torso, but by clicking on them in your hands, they can also be set to bind arms and legs, acting in a similar way to handcuffs. They are worn in the suit slot.

They can be found in the costume vendors, maint and the restraints crate from cargo.

They have sprites for humanoid mobs and digitigrade legs, but not tesh yet.

* Fix mistake

Fixes error in previous commit

* Update code/game/objects/items/weapons/handcuffs.dm

Co-authored-by: ShadowLarkens <shadowlarkens@gmail.com>

* Update code/modules/mob/living/carbon/human/human.dm

Co-authored-by: ShadowLarkens <shadowlarkens@gmail.com>

* Make these defines to prevent copy paste errors

---------

Co-authored-by: ShadowLarkens <shadowlarkens@gmail.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
This commit is contained in:
SatinIsle
2025-09-21 22:52:55 +01:00
committed by GitHub
parent 656c525780
commit 14cdd67eed
14 changed files with 128 additions and 8 deletions
+2 -1
View File
@@ -182,7 +182,8 @@
/obj/item/handcuffs/legcuffs/fuzzy,
/obj/item/melee/fluff/holochain/mass,
/obj/item/material/twohanded/riding_crop,
/obj/item/clothing/under/fluff/latexmaid
/obj/item/clothing/under/fluff/latexmaid,
/obj/item/clothing/suit/shibari/pink
)
containertype = /obj/structure/closet/crate
containername = "Restraints crate"
@@ -172,7 +172,7 @@
if (!ishuman(target)) return
var/mob/living/carbon/human/H = target
if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket) || H.stat)
if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket) || istype(H.wear_suit, /obj/item/clothing/suit/shibari) || H.stat)
if (src.amount > 2)
var/obj/effect/spresent/present = new /obj/effect/spresent (H.loc)
src.amount -= 2
@@ -125,6 +125,10 @@ var/last_chew = 0
if (H.zone_sel.selecting != O_MOUTH) return
if (H.wear_mask) return
if (istype(H.wear_suit, /obj/item/clothing/suit/straight_jacket)) return
if (istype(H.wear_suit, /obj/item/clothing/suit/shibari))
var/obj/item/clothing/suit/shibari/s = wear_suit
if(s.rope_mode == "Arms" || s.rope_mode == "Arms and Legs")
return
var/obj/item/organ/external/O = H.organs_by_name[(H.hand ? BP_L_HAND : BP_R_HAND)]
if (!O) return
+2 -1
View File
@@ -118,7 +118,8 @@ something, make sure it's not in one of the other lists.*/
prob(2);/obj/item/cracker,
prob(5);/obj/random/mega_nukies,
prob(1);/obj/random/potion_ingredient/plus,
prob(2);/obj/random/translator
prob(2);/obj/random/translator,
prob(1);/obj/random/shibari
/* VOREStation Edit End */
)
+17
View File
@@ -419,3 +419,20 @@
prob(10);/obj/item/reagent_containers/food/drinks/cans/nukie_mega_shrink,
prob(10);/obj/item/reagent_containers/food/drinks/cans/nukie_mega_grow
)
/obj/random/shibari
name = "random shibari"
desc = "A random shibari."
icon = 'icons/inventory/suit/item.dmi'
icon_state = "shibari_None"
spawn_nothing_percentage = 0
/obj/random/shibari/item_to_spawn()
return pick(prob(5);/obj/item/clothing/suit/shibari,
prob(5);/obj/item/clothing/suit/shibari/red,
prob(5);/obj/item/clothing/suit/shibari/blue,
prob(5);/obj/item/clothing/suit/shibari/green,
prob(5);/obj/item/clothing/suit/shibari/yellow,
prob(5);/obj/item/clothing/suit/shibari/black,
prob(5);/obj/item/clothing/suit/shibari/pink
)
+84
View File
@@ -0,0 +1,84 @@
// Behaves similar to straight jackets but the effects can be varied easily.
#define SHIBARI_NONE "None"
#define SHIBARI_ARMS "Arms"
#define SHIBARI_LEGS "Legs"
#define SHIBARI_BOTH "Arms and Legs"
/obj/item/clothing/suit/shibari
name = "shibari bindings"
desc = "A set of ropes that designed to be tied around another person to restrain them."
icon_state = "shibari_None"
var/resist_time = 1 MINUTE
var/rope_mode = SHIBARI_NONE
/obj/item/clothing/suit/shibari/attack_hand(mob/living/user as mob)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(src == H.wear_suit)
to_chat(H, span_notice("You need help taking this off!"))
return
..()
/obj/item/clothing/suit/shibari/attack_self(mob/living/user)
rope_mode = tgui_input_list(user, "Which limbs would you like to restrain with the bindings?", "Shibari", list(SHIBARI_NONE, SHIBARI_ARMS, SHIBARI_LEGS, SHIBARI_BOTH))
if(!rope_mode)
rope_mode = SHIBARI_NONE
if(rope_mode == SHIBARI_BOTH)
icon_state = "shibari_Both"
else
icon_state = "shibari_[rope_mode]"
/obj/item/clothing/suit/shibari/equipped(var/mob/living/user,var/slot)
. = ..()
if((rope_mode == SHIBARI_ARMS) || (rope_mode == SHIBARI_BOTH))
if(slot == slot_wear_suit)
if(user.get_left_hand() != src)
user.drop_l_hand()
if(user.get_right_hand() != src)
user.drop_r_hand()
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.drop_from_inventory(H.handcuffed)
if((rope_mode == SHIBARI_LEGS) || (rope_mode == SHIBARI_BOTH))
if(slot == slot_wear_suit)
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.drop_from_inventory(H.legcuffed)
H.legcuffed = src
if(user.m_intent != I_WALK)
user.m_intent = I_WALK
if(user.hud_used && user.hud_used.move_intent)
user.hud_used.move_intent.icon_state = "walking"
/obj/item/clothing/suit/shibari/dropped(var/mob/living/user)
..()
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.legcuffed == src)
H.legcuffed = FALSE
/obj/item/clothing/suit/shibari/red
color = "#ff0000"
/obj/item/clothing/suit/shibari/blue
color = "#006aff"
/obj/item/clothing/suit/shibari/green
color = "#00ff0d"
/obj/item/clothing/suit/shibari/yellow
color = "#f6ff00"
/obj/item/clothing/suit/shibari/black
color = "#000000"
/obj/item/clothing/suit/shibari/pink
color = "#ff00bf"
#undef SHIBARI_NONE
#undef SHIBARI_ARMS
#undef SHIBARI_LEGS
#undef SHIBARI_BOTH
+4 -2
View File
@@ -1515,7 +1515,8 @@
/obj/item/clothing/under/reverse_bunnytop_maid = 3,
/obj/item/clothing/head/rabbitears = 3,
/obj/item/clothing/accessory/bunny_tail = 3,
/obj/item/clothing/suit/shrine_maiden = 3)
/obj/item/clothing/suit/shrine_maiden = 3,
/obj/item/clothing/suit/shibari = 5)
prices = list(/obj/item/clothing/suit/storage/hooded/costume/carp = 200,
/obj/item/clothing/suit/storage/hooded/costume/carp = 200,
/obj/item/clothing/suit/chickensuit = 200,
@@ -1600,7 +1601,8 @@
/obj/item/clothing/under/reverse_bunnytop_maid = 50,
/obj/item/clothing/head/rabbitears = 25,
/obj/item/clothing/accessory/bunny_tail = 25,
/obj/item/clothing/suit/shrine_maiden = 200)
/obj/item/clothing/suit/shrine_maiden = 200,
/obj/item/clothing/suit/shibari = 50)
premium = list(/obj/item/clothing/suit/imperium_monk = 3,
/obj/item/clothing/suit/barding/agatha = 2,
/obj/item/clothing/suit/barding/alt_agatha = 2,
@@ -269,6 +269,10 @@
return 1
if (istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
return 1
if (istype(wear_suit, /obj/item/clothing/suit/shibari))
var/obj/item/clothing/suit/shibari/s = wear_suit
if(s.rope_mode == "Arms" || s.rope_mode == "Arms and Legs")
return 1
return 0
/mob/living/carbon/human/var/co2overloadtime = null
@@ -1,5 +1,5 @@
/mob/living/carbon/human/resist_restraints()
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
if(wear_suit && (istype(wear_suit, /obj/item/clothing/suit/straight_jacket) || istype(wear_suit, /obj/item/clothing/suit/shibari)))
return escape_straight_jacket()
return ..()
@@ -14,10 +14,16 @@
break_straight_jacket()
return
var/breakouttime
var/mob/living/carbon/human/H = src
var/obj/item/clothing/suit/straight_jacket/SJ = H.wear_suit
if(istype(wear_suit, /obj/item/clothing/suit/straight_jacket))
var/obj/item/clothing/suit/straight_jacket/S = H.wear_suit
breakouttime = S.resist_time
if(istype(wear_suit, /obj/item/clothing/suit/shibari))
var/obj/item/clothing/suit/shibari/S = H.wear_suit
breakouttime = S.resist_time
var/breakouttime = SJ.resist_time // Configurable per-jacket!
var/obj/item/clothing/suit/SJ = wear_suit
var/attack_type = RESIST_ATTACK_DEFAULT
Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 282 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 671 KiB

After

Width:  |  Height:  |  Size: 796 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 KiB

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 702 B

After

Width:  |  Height:  |  Size: 2.7 KiB

+1
View File
@@ -2484,6 +2484,7 @@
#include "code\modules\clothing\suits\miscellaneous.dm"
#include "code\modules\clothing\suits\miscellaneous_vr.dm"
#include "code\modules\clothing\suits\neosuits.dm"
#include "code\modules\clothing\suits\shibari.dm"
#include "code\modules\clothing\suits\solgov.dm"
#include "code\modules\clothing\suits\solgov_vr.dm"
#include "code\modules\clothing\suits\storage.dm"