* 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
+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