diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 58ca8bbea9..182b7e2756 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -12,6 +12,8 @@
var/list/abductee_minds
var/flash = " - || - "
var/obj/machinery/abductor/console/console
+ var/message_cooldown = 0
+ var/breakout_time = 0.75
/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user)
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target))
@@ -40,25 +42,23 @@
/obj/machinery/abductor/experiment/relaymove(mob/user)
if(user.stat != CONSCIOUS)
return
- container_resist(user)
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
/obj/machinery/abductor/experiment/container_resist(mob/living/user)
- var/breakout_time = 600
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
- to_chat(user, "You lean on the back of [src] and start pushing the door open... (this will take about a minute.)")
- user.visible_message("You hear a metallic creaking from [src]!")
-
- if(do_after(user,(breakout_time), target = src))
+ user.visible_message("You see [user] kicking against the door of [src]!", \
+ "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \
+ "You hear a metallic creaking from [src].")
+ if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds
if(!user || user.stat != CONSCIOUS || user.loc != src || state_open)
return
-
- visible_message("[user] successfully broke out of [src]!")
- to_chat(user, "You successfully break out of [src]!")
-
+ user.visible_message("[user] successfully broke out of [src]!", \
+ "You successfully break out of [src]!")
open_machine()
-
/obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H)
var/icon/photo = null
var/g = (H.gender == FEMALE) ? "f" : "m"
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 7ea954a671..2276b5154b 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -392,6 +392,9 @@
QDEL_IN(mob_occupant, 40)
/obj/machinery/clonepod/relaymove(mob/user)
+ container_resist()
+
+/obj/machinery/clonepod/container_resist(mob/living/user)
if(user.stat == CONSCIOUS)
go_out()
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 65a6088721..4085b4edb4 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -14,6 +14,8 @@
var/damage_coeff
var/scan_level
var/precision_coeff
+ var/message_cooldown
+ var/breakout_time = 2
/obj/machinery/dna_scannernew/RefreshParts()
scan_level = 0
@@ -65,23 +67,20 @@
open_machine()
/obj/machinery/dna_scannernew/container_resist(mob/living/user)
- var/breakout_time = 2
- if(state_open || !locked) //Open and unlocked, no need to escape
- state_open = TRUE
+ if(!locked)
+ open_machine()
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
- to_chat(user, "You lean on the back of [src] and start pushing the door open... (this will take about [breakout_time] minutes.)")
- user.visible_message("You hear a metallic creaking from [src]!")
-
+ user.visible_message("You see [user] kicking against the door of [src]!", \
+ "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \
+ "You hear a metallic creaking from [src].")
if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds
if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked)
return
-
locked = FALSE
- visible_message("[user] successfully broke out of [src]!")
- to_chat(user, "You successfully break out of [src]!")
-
+ user.visible_message("[user] successfully broke out of [src]!", \
+ "You successfully break out of [src]!")
open_machine()
/obj/machinery/dna_scannernew/proc/locate_computer(type_)
@@ -122,10 +121,11 @@
/obj/machinery/dna_scannernew/relaymove(mob/user as mob)
if(user.stat || locked)
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
return
-
open_machine()
- return
/obj/machinery/dna_scannernew/attackby(obj/item/I, mob/user, params)
diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm
index b37c5a10a7..d77e91af90 100644
--- a/code/game/machinery/gulag_teleporter.dm
+++ b/code/game/machinery/gulag_teleporter.dm
@@ -19,6 +19,8 @@ The console is located at computer/gulag_teleporter.dm
active_power_usage = 5000
circuit = /obj/item/circuitboard/machine/gulag_teleporter
var/locked = FALSE
+ var/message_cooldown
+ var/breakout_time = 1
var/jumpsuit_type = /obj/item/clothing/under/rank/prisoner
var/shoes_type = /obj/item/clothing/shoes/sneakers/orange
var/obj/machinery/gulag_item_reclaimer/linked_reclaimer
@@ -46,7 +48,7 @@ The console is located at computer/gulag_teleporter.dm
/obj/machinery/gulag_teleporter/interact(mob/user)
if(locked)
- to_chat(user, "[src] is locked.")
+ to_chat(user, "[src] is locked!")
return
toggle_open()
@@ -89,28 +91,27 @@ The console is located at computer/gulag_teleporter.dm
if(user.stat != CONSCIOUS)
return
if(locked)
- to_chat(user, "[src] is locked!")
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
return
open_machine()
/obj/machinery/gulag_teleporter/container_resist(mob/living/user)
- var/breakout_time = 600
if(!locked)
open_machine()
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
- to_chat(user, "You lean on the back of [src] and start pushing the door open... (this will take about a minute.)")
- user.visible_message("You hear a metallic creaking from [src]!")
-
- if(do_after(user,(breakout_time), target = src))
+ user.visible_message("You see [user] kicking against the door of [src]!", \
+ "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \
+ "You hear a metallic creaking from [src].")
+ if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds
if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked)
return
-
locked = FALSE
- visible_message("[user] successfully broke out of [src]!")
- to_chat(user, "You successfully break out of [src]!")
-
+ user.visible_message("[user] successfully broke out of [src]!", \
+ "You successfully break out of [src]!")
open_machine()
/obj/machinery/gulag_teleporter/proc/locate_reclaimer()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index cd2a5bd3b5..6ab0cbf17b 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -6,6 +6,7 @@
icon_state = "close"
anchored = TRUE
density = TRUE
+<<<<<<< HEAD
max_integrity = 250
var/obj/item/clothing/suit/space/suit = null
@@ -101,6 +102,105 @@
mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/tank/internals/emergency_oxygen/double
+=======
+ max_integrity = 250
+
+ var/obj/item/clothing/suit/space/suit = null
+ var/obj/item/clothing/head/helmet/space/helmet = null
+ var/obj/item/clothing/mask/mask = null
+ var/obj/item/storage = null
+
+ var/suit_type = null
+ var/helmet_type = null
+ var/mask_type = null
+ var/storage_type = null
+
+ state_open = FALSE
+ var/locked = FALSE
+ panel_open = FALSE
+ var/safeties = TRUE
+
+ var/uv = FALSE
+ var/uv_super = FALSE
+ var/uv_cycles = 6
+ var/message_cooldown
+ var/breakout_time = 0.5
+
+/obj/machinery/suit_storage_unit/standard_unit
+ suit_type = /obj/item/clothing/suit/space/eva
+ helmet_type = /obj/item/clothing/head/helmet/space/eva
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/captain
+ suit_type = /obj/item/clothing/suit/space/hardsuit/captain
+ mask_type = /obj/item/clothing/mask/gas/sechailer
+ storage_type = /obj/item/tank/jetpack/oxygen/captain
+
+/obj/machinery/suit_storage_unit/engine
+ suit_type = /obj/item/clothing/suit/space/hardsuit/engine
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/ce
+ suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite
+ mask_type = /obj/item/clothing/mask/breath
+ storage_type= /obj/item/clothing/shoes/magboots/advance
+
+/obj/machinery/suit_storage_unit/security
+ suit_type = /obj/item/clothing/suit/space/hardsuit/security
+ mask_type = /obj/item/clothing/mask/gas/sechailer
+
+/obj/machinery/suit_storage_unit/hos
+ suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos
+ mask_type = /obj/item/clothing/mask/gas/sechailer
+ storage_type = /obj/item/tank/internals/oxygen
+
+/obj/machinery/suit_storage_unit/atmos
+ suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos
+ mask_type = /obj/item/clothing/mask/gas
+ storage_type = /obj/item/watertank/atmos
+
+/obj/machinery/suit_storage_unit/mining
+ suit_type = /obj/item/clothing/suit/hooded/explorer
+ mask_type = /obj/item/clothing/mask/gas/explorer
+
+/obj/machinery/suit_storage_unit/mining/eva
+ suit_type = /obj/item/clothing/suit/space/hardsuit/mining
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/cmo
+ suit_type = /obj/item/clothing/suit/space/hardsuit/medical
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/rd
+ suit_type = /obj/item/clothing/suit/space/hardsuit/rd
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/syndicate
+ suit_type = /obj/item/clothing/suit/space/hardsuit/syndi
+ mask_type = /obj/item/clothing/mask/gas/syndicate
+ storage_type = /obj/item/tank/jetpack/oxygen/harness
+
+/obj/machinery/suit_storage_unit/ert/command
+ suit_type = /obj/item/clothing/suit/space/hardsuit/ert
+ mask_type = /obj/item/clothing/mask/breath
+ storage_type = /obj/item/tank/internals/emergency_oxygen/double
+
+/obj/machinery/suit_storage_unit/ert/security
+ suit_type = /obj/item/clothing/suit/space/hardsuit/ert/sec
+ mask_type = /obj/item/clothing/mask/breath
+ storage_type = /obj/item/tank/internals/emergency_oxygen/double
+
+/obj/machinery/suit_storage_unit/ert/engineer
+ suit_type = /obj/item/clothing/suit/space/hardsuit/ert/engi
+ mask_type = /obj/item/clothing/mask/breath
+ storage_type = /obj/item/tank/internals/emergency_oxygen/double
+
+/obj/machinery/suit_storage_unit/ert/medical
+ suit_type = /obj/item/clothing/suit/space/hardsuit/ert/med
+ mask_type = /obj/item/clothing/mask/breath
+ storage_type = /obj/item/tank/internals/emergency_oxygen/double
+
+>>>>>>> d4d898f... Regularizes resisting out of containers (#30412)
/obj/machinery/suit_storage_unit/Initialize()
. = ..()
wires = new /datum/wires/suit_storage_unit(src)
@@ -162,6 +262,7 @@
/obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE)
if(!(flags_1 & NODECONSTRUCT_1))
+<<<<<<< HEAD
open_machine()
dump_contents()
new /obj/item/stack/sheet/metal (loc, 2)
@@ -312,6 +413,183 @@
return ..()
+=======
+ open_machine()
+ dump_contents()
+ new /obj/item/stack/sheet/metal (loc, 2)
+ qdel(src)
+
+/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user)
+ if(user.stat || user.lying || !Adjacent(user) || !Adjacent(A) || !isliving(A))
+ return
+ var/mob/living/target = A
+ if(!state_open)
+ to_chat(user, "The unit's doors are shut!")
+ return
+ if(!is_operational())
+ to_chat(user, "The unit is not operational!")
+ return
+ if(occupant || helmet || suit || storage)
+ to_chat(user, "It's too cluttered inside to fit in!")
+ return
+
+ if(target == user)
+ user.visible_message("[user] starts squeezing into [src]!", "You start working your way into [src]...")
+ else
+ target.visible_message("[user] starts shoving [target] into [src]!", "[user] starts shoving you into [src]!")
+
+ if(do_mob(user, target, 30))
+ if(occupant || helmet || suit || storage)
+ return
+ if(target == user)
+ user.visible_message("[user] slips into [src] and closes the door behind them!", "You slip into [src]'s cramped space and shut its door.")
+ else
+ target.visible_message("[user] pushes [target] into [src] and shuts its door!", "[user] shoves you into [src] and shuts the door!")
+ close_machine(target)
+ add_fingerprint(user)
+
+/obj/machinery/suit_storage_unit/proc/cook()
+ if(uv_cycles)
+ uv_cycles--
+ uv = TRUE
+ locked = TRUE
+ update_icon()
+ if(occupant)
+ var/mob/living/mob_occupant = occupant
+ if(uv_super)
+ mob_occupant.adjustFireLoss(rand(20, 36))
+ else
+ mob_occupant.adjustFireLoss(rand(10, 16))
+ mob_occupant.emote("scream")
+ addtimer(CALLBACK(src, .proc/cook), 50)
+ else
+ uv_cycles = initial(uv_cycles)
+ uv = FALSE
+ locked = FALSE
+ if(uv_super)
+ visible_message("[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber.")
+ playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, 1)
+ helmet = null
+ qdel(helmet)
+ suit = null
+ qdel(suit) // Delete everything but the occupant.
+ mask = null
+ qdel(mask)
+ storage = null
+ qdel(storage)
+ // The wires get damaged too.
+ wires.cut_all()
+ else
+ if(!occupant)
+ visible_message("[src]'s door slides open. The glowing yellow lights dim to a gentle green.")
+ else
+ visible_message("[src]'s door slides open, barraging you with the nauseating smell of charred flesh.")
+ playsound(src, 'sound/machines/airlockclose.ogg', 25, 1)
+ for(var/obj/item/I in src) //Scorches away blood and forensic evidence, although the SSU itself is unaffected
+ I.clean_blood()
+ I.fingerprints = list()
+ open_machine(FALSE)
+ if(occupant)
+ dump_contents()
+
+/obj/machinery/suit_storage_unit/proc/shock(mob/user, prb)
+ if(!prob(prb))
+ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ if(electrocute_mob(user, src, src, 1, TRUE))
+ return 1
+
+/obj/machinery/suit_storage_unit/relaymove(mob/user)
+ if(locked)
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
+ return
+ open_machine()
+ dump_contents()
+
+/obj/machinery/suit_storage_unit/container_resist(mob/living/user)
+ if(!locked)
+ open_machine()
+ dump_contents()
+ return
+ user.changeNext_move(CLICK_CD_BREAKOUT)
+ user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.visible_message("You see [user] kicking against the doors of [src]!", \
+ "You start kicking against the doors... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \
+ "You hear a thump from [src].")
+ if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds
+ if(!user || user.stat != CONSCIOUS || user.loc != src )
+ return
+ user.visible_message("[user] successfully broke out of [src]!", \
+ "You successfully break out of [src]!")
+ open_machine()
+ dump_contents()
+
+ add_fingerprint(user)
+ if(locked)
+ visible_message("You see [user] kicking against the doors of [src]!", \
+ "You start kicking against the doors...")
+ addtimer(CALLBACK(src, .proc/resist_open, user), 300)
+ else
+ open_machine()
+ dump_contents()
+
+/obj/machinery/suit_storage_unit/proc/resist_open(mob/user)
+ if(!state_open && occupant && (user in src) && user.stat == 0) // Check they're still here.
+ visible_message("You see [user] bursts out of [src]!", \
+ "You escape the cramped confines of [src]!")
+ open_machine()
+
+/obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params)
+ if(state_open && is_operational())
+ if(istype(I, /obj/item/clothing/suit/space))
+ if(suit)
+ to_chat(user, "The unit already contains a suit!.")
+ return
+ if(!user.drop_item())
+ return
+ suit = I
+ else if(istype(I, /obj/item/clothing/head/helmet))
+ if(helmet)
+ to_chat(user, "The unit already contains a helmet!")
+ return
+ if(!user.drop_item())
+ return
+ helmet = I
+ else if(istype(I, /obj/item/clothing/mask))
+ if(mask)
+ to_chat(user, "The unit already contains a mask!")
+ return
+ if(!user.drop_item())
+ return
+ mask = I
+ else
+ if(storage)
+ to_chat(user, "The auxiliary storage compartment is full!")
+ return
+ if(!user.drop_item())
+ return
+ storage = I
+
+ I.loc = src
+ visible_message("[user] inserts [I] into [src]", "You load [I] into [src].")
+ update_icon()
+ return
+
+ if(panel_open && is_wire_tool(I))
+ wires.interact(user)
+ if(!state_open)
+ if(default_deconstruction_screwdriver(user, "panel", "close", I))
+ return
+ if(default_pry_open(I))
+ dump_contents()
+ return
+
+ return ..()
+
+>>>>>>> d4d898f... Regularizes resisting out of containers (#30412)
/obj/machinery/suit_storage_unit/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm
index 55a35960cf..c7035f748e 100644
--- a/code/game/objects/items/implants/implantchair.dm
+++ b/code/game/objects/items/implants/implantchair.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
/obj/machinery/implantchair
name = "mindshield implanter"
desc = "Used to implant occupants with mindshield implants."
@@ -185,3 +186,193 @@
log_game("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
return 1
+=======
+/obj/machinery/implantchair
+ name = "mindshield implanter"
+ desc = "Used to implant occupants with mindshield implants."
+ icon = 'icons/obj/machines/implantchair.dmi'
+ icon_state = "implantchair"
+ density = TRUE
+ opacity = 0
+ anchored = TRUE
+
+ var/ready = TRUE
+ var/replenishing = FALSE
+
+ var/ready_implants = 5
+ var/max_implants = 5
+ var/injection_cooldown = 600
+ var/replenish_cooldown = 6000
+ var/implant_type = /obj/item/implant/mindshield
+ var/auto_inject = FALSE
+ var/auto_replenish = TRUE
+ var/special = FALSE
+ var/special_name = "special function"
+ var/message_cooldown
+ var/breakout_time = 1
+
+/obj/machinery/implantchair/Initialize()
+ . = ..()
+ open_machine()
+ update_icon()
+
+
+/obj/machinery/implantchair/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.notcontained_state)
+ ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "implantchair", name, 375, 280, master_ui, state)
+ ui.open()
+
+
+/obj/machinery/implantchair/ui_data()
+ var/list/data = list()
+ data["occupied"] = occupant ? 1 : 0
+ data["open"] = state_open
+
+ data["occupant"] = list()
+ if(occupant)
+ var/mob/living/mob_occupant = occupant
+ data["occupant"]["name"] = mob_occupant.name
+ data["occupant"]["stat"] = mob_occupant.stat
+
+ data["special_name"] = special ? special_name : null
+ data["ready_implants"] = ready_implants
+ data["ready"] = ready
+ data["replenishing"] = replenishing
+
+ return data
+
+/obj/machinery/implantchair/ui_act(action, params)
+ if(..())
+ return
+ switch(action)
+ if("door")
+ if(state_open)
+ close_machine()
+ else
+ open_machine()
+ . = TRUE
+ if("implant")
+ implant(occupant,usr)
+ . = TRUE
+
+/obj/machinery/implantchair/proc/implant(mob/living/M,mob/user)
+ if (!istype(M))
+ return
+ if(!ready_implants || !ready)
+ return
+ if(implant_action(M,user))
+ ready_implants--
+ if(!replenishing && auto_replenish)
+ replenishing = TRUE
+ addtimer(CALLBACK(src,"replenish"),replenish_cooldown)
+ if(injection_cooldown > 0)
+ ready = FALSE
+ addtimer(CALLBACK(src,"set_ready"),injection_cooldown)
+ else
+ playsound(get_turf(src), 'sound/machines/buzz-sigh.ogg', 25, 1)
+ update_icon()
+
+/obj/machinery/implantchair/proc/implant_action(mob/living/M)
+ var/obj/item/implant/I = new implant_type
+ if(I.implant(M))
+ visible_message("[M] has been implanted by the [name].")
+ return 1
+
+/obj/machinery/implantchair/update_icon()
+ icon_state = initial(icon_state)
+ if(state_open)
+ icon_state += "_open"
+ if(occupant)
+ icon_state += "_occupied"
+ if(ready)
+ add_overlay("ready")
+ else
+ cut_overlays()
+
+/obj/machinery/implantchair/proc/replenish()
+ if(ready_implants < max_implants)
+ ready_implants++
+ if(ready_implants < max_implants)
+ addtimer(CALLBACK(src,"replenish"),replenish_cooldown)
+ else
+ replenishing = FALSE
+
+/obj/machinery/implantchair/proc/set_ready()
+ ready = TRUE
+ update_icon()
+
+/obj/machinery/implantchair/container_resist(mob/living/user)
+ user.changeNext_move(CLICK_CD_BREAKOUT)
+ user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.visible_message("You see [user] kicking against the door of [src]!", \
+ "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \
+ "You hear a metallic creaking from [src].")
+ if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds
+ if(!user || user.stat != CONSCIOUS || user.loc != src || state_open)
+ return
+ user.visible_message("[user] successfully broke out of [src]!", \
+ "You successfully break out of [src]!")
+ open_machine()
+
+/obj/machinery/implantchair/relaymove(mob/user)
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
+
+/obj/machinery/implantchair/MouseDrop_T(mob/target, mob/user)
+ if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser())
+ return
+ close_machine(target)
+
+/obj/machinery/implantchair/close_machine(mob/living/user)
+ if((isnull(user) || istype(user)) && state_open)
+ ..(user)
+ if(auto_inject && ready && ready_implants > 0)
+ implant(user,null)
+
+/obj/machinery/implantchair/genepurge
+ name = "Genetic purifier"
+ desc = "Used to purge human genome of foreign influences"
+ special = TRUE
+ special_name = "Purge genome"
+ injection_cooldown = 0
+ replenish_cooldown = 300
+
+/obj/machinery/implantchair/genepurge/implant_action(mob/living/carbon/human/H,mob/user)
+ if(!istype(H))
+ return 0
+ H.set_species(/datum/species/human, 1)//lizards go home
+ purrbation_remove(H)//remove cats
+ H.dna.remove_all_mutations()//hulks out
+ return 1
+
+
+/obj/machinery/implantchair/brainwash
+ name = "Neural Imprinter"
+ desc = "Used to indoctrinate rehabilitate hardened recidivists."
+ special_name = "Imprint"
+ injection_cooldown = 3000
+ auto_inject = FALSE
+ auto_replenish = FALSE
+ special = TRUE
+ var/objective = "Obey the law. Praise Nanotrasen."
+ var/custom = FALSE
+
+/obj/machinery/implantchair/brainwash/implant_action(mob/living/C,mob/user)
+ if(!istype(C) || !C.mind) // I don't know how this makes any sense for silicons but laws trump objectives anyway.
+ return 0
+ if(custom)
+ if(!user || !user.Adjacent(src))
+ return 0
+ objective = stripped_input(usr,"What order do you want to imprint on [C]?","Enter the order","",120)
+ message_admins("[key_name_admin(user)] set brainwash machine objective to '[objective]'.")
+ log_game("[key_name_admin(user)] set brainwash machine objective to '[objective]'.")
+ var/datum/objective/custom_objective = new/datum/objective(objective)
+ custom_objective.owner = C.mind
+ C.mind.objectives += custom_objective
+ C.mind.announce_objectives()
+ message_admins("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
+ log_game("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.")
+ return 1
+>>>>>>> d4d898f... Regularizes resisting out of containers (#30412)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 78e672e49d..4f8705aa71 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -16,7 +16,7 @@
integrity_failure = 50
armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 70, acid = 60)
var/breakout_time = 2
- var/lastbang
+ var/message_cooldown
var/can_weld_shut = TRUE
var/horizontal = FALSE
var/allow_objects = FALSE
@@ -300,14 +300,12 @@
/obj/structure/closet/relaymove(mob/user)
if(user.stat || !isturf(loc) || !isliving(user))
return
- var/mob/living/L = user
- if(!open())
- if(L.last_special <= world.time)
- container_resist(L)
- if(world.time > lastbang+5)
- lastbang = world.time
- for(var/mob/M in get_hearers_in_view(src, null))
- M.show_message("BANG, bang!", 2)
+ if(locked)
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
+ return
+ container_resist()
/obj/structure/closet/attack_hand(mob/user)
..()
@@ -367,9 +365,10 @@
//okay, so the closet is either welded or locked... resist!!!
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
- to_chat(user, "You lean on the back of [src] and start pushing the door open.")
- visible_message("[src] begins to shake violently!")
- if(do_after(user,(breakout_time * 60 * 10), target = src)) //minutes * 60seconds * 10deciseconds
+ user.visible_message("[src] begins to shake violently!", \
+ "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \
+ "You hear banging from [src].")
+ if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds
if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) )
return
//we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
@@ -388,7 +387,7 @@
/obj/structure/closet/AltClick(mob/user)
..()
- if(!user.canUseTopic(src, be_close=TRUE))
+ if(!user.canUseTopic(src, be_close=TRUE) || isturf(loc))
to_chat(user, "You can't do that right now!")
return
if(opened || !secure)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 600e15201d..f4a98811c0 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -23,6 +23,8 @@
var/obj/structure/tray/connected = null
var/locked = FALSE
var/opendir = SOUTH
+ var/message_cooldown
+ var/breakout_time = 1
/obj/structure/bodycontainer/Destroy()
open()
@@ -41,6 +43,11 @@
/obj/structure/bodycontainer/relaymove(mob/user)
if(user.stat || !isturf(loc))
return
+ if(locked)
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
+ return
open()
/obj/structure/bodycontainer/attack_paw(mob/user)
@@ -84,11 +91,20 @@
qdel(src)
/obj/structure/bodycontainer/container_resist(mob/living/user)
- open()
-
-/obj/structure/bodycontainer/relay_container_resist(mob/living/user, obj/O)
- to_chat(user, "You slam yourself into the side of [O].")
- container_resist(user)
+ if(!locked)
+ open()
+ return
+ user.changeNext_move(CLICK_CD_BREAKOUT)
+ user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.visible_message(null, \
+ "You lean on the back of [src] and start pushing the tray open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \
+ "You hear a metallic creaking from [src].")
+ if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds
+ if(!user || user.stat != CONSCIOUS || user.loc != src )
+ return
+ user.visible_message("[user] successfully broke out of [src]!", \
+ "You successfully break out of [src]!")
+ open()
/obj/structure/bodycontainer/proc/open()
playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1)
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index 89f02b13af..fcd9ead2a7 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -66,6 +66,9 @@
deconstruct(FALSE)
/obj/structure/transit_tube_pod/container_resist(mob/living/user)
+ if(!user.incapacitated())
+ empty_pod()
+ return
if(!moving)
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index a83ced850e..f447b2f3e9 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -49,6 +49,10 @@
open_machine()
+/obj/machinery/vr_sleeper/container_resist(mob/living/user)
+ open_machine()
+
+
/obj/machinery/vr_sleeper/Destroy()
open_machine()
cleanup_vr_human()
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index f0f41e375a..89e6538b07 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -32,6 +32,8 @@
var/running_bob_anim = FALSE
var/escape_in_progress = FALSE
+ var/message_cooldown
+ var/breakout_time = 0.5
/obj/machinery/atmospherics/components/unary/cryo_cell/Initialize()
. = ..()
@@ -219,7 +221,9 @@
update_icon()
/obj/machinery/atmospherics/components/unary/cryo_cell/relaymove(mob/user)
- container_resist(user)
+ if(message_cooldown <= world.time)
+ message_cooldown = world.time + 50
+ to_chat(user, "[src]'s door won't budge!")
/obj/machinery/atmospherics/components/unary/cryo_cell/open_machine(drop = 0)
if(!state_open && !panel_open)
@@ -239,16 +243,17 @@
return occupant
/obj/machinery/atmospherics/components/unary/cryo_cell/container_resist(mob/living/user)
- if(escape_in_progress)
- to_chat(user, "You are already trying to exit (This will take around 30 seconds)")
- return
- escape_in_progress = TRUE
- to_chat(user, "You struggle inside the cryotube, kicking the release with your foot... (This will take around 30 seconds.)")
- audible_message("You hear a thump from [src].")
- if(do_after(user, 300))
- if(occupant == user) // Check they're still here.
- open_machine()
- escape_in_progress = FALSE
+ user.changeNext_move(CLICK_CD_BREAKOUT)
+ user.last_special = world.time + CLICK_CD_BREAKOUT
+ user.visible_message("You see [user] kicking against the glass of [src]!", \
+ "You struggle inside [src], kicking the release with your foot... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \
+ "You hear a thump from [src].")
+ if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds
+ if(!user || user.stat != CONSCIOUS || user.loc != src )
+ return
+ user.visible_message("[user] successfully broke out of [src]!", \
+ "You successfully break out of [src]!")
+ open_machine()
/obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user)
..()
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index d9f70160a4..978e8af62d 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -51,6 +51,9 @@
/obj/machinery/gibber/container_resist(mob/living/user)
go_out()
+/obj/machinery/gibber/relaymove(mob/living/user)
+ go_out()
+
/obj/machinery/gibber/attack_hand(mob/user)
if(stat & (NOPOWER|BROKEN))
return
@@ -225,4 +228,4 @@
if(M.loc == input_plate)
M.forceMove(src)
- M.gib()
\ No newline at end of file
+ M.gib()