diff --git a/baystation12.dme b/baystation12.dme
index 6b2eb45f8c..35bb8437e5 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -489,6 +489,7 @@
#include "code\game\mecha\working\hoverpod.dm"
#include "code\game\mecha\working\ripley.dm"
#include "code\game\mecha\working\working.dm"
+#include "code\game\objects\buckling.dm"
#include "code\game\objects\empulse.dm"
#include "code\game\objects\explosion.dm"
#include "code\game\objects\explosion_recursive.dm"
diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm
index c22c483e8c..f9dbef84cf 100644
--- a/code/ATMOSPHERICS/he_pipes.dm
+++ b/code/ATMOSPHERICS/he_pipes.dm
@@ -3,18 +3,23 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging
icon = 'icons/atmos/heat.dmi'
icon_state = "intact"
pipe_icon = "hepipe"
+ color = "#404040"
level = 2
var/initialize_directions_he
var/surface = 2 //surface area in m^2
+ var/icon_temperature = T20C //stop small changes in temperature causing an icon refresh
minimum_temperature_difference = 20
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
+ buckle_lying = 1
+
// BubbleWrap
New()
..()
initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe
// BubbleWrap END
+ color = "#404040" //we don't make use of the fancy overlay system for colours, use this to set the default.
initialize()
normalize_dir()
@@ -48,19 +53,53 @@ obj/machinery/atmospherics/pipe/simple/heat_exchanging
if(!parent)
..()
else
- var/environment_temperature = 0
+ var/datum/gas_mixture/pipe_air = return_air()
if(istype(loc, /turf/simulated/))
+ var/environment_temperature = 0
if(loc:blocks_air)
environment_temperature = loc:temperature
else
var/datum/gas_mixture/environment = loc.return_air()
environment_temperature = environment.temperature
- var/datum/gas_mixture/pipe_air = return_air()
if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference)
parent.temperature_interact(loc, volume, thermal_conductivity)
else if(istype(loc, /turf/space/))
parent.radiate_heat_to_space(surface, 1)
+ if(buckled_mob)
+ var/hc = pipe_air.heat_capacity()
+ var/avg_temp = (pipe_air.temperature * hc + buckled_mob.bodytemperature * 3500) / (hc + 3500)
+ pipe_air.temperature = avg_temp
+ buckled_mob.bodytemperature = avg_temp
+
+ var/heat_limit = 1000
+
+ var/mob/living/carbon/human/H = buckled_mob
+ if(istype(H) && H.species)
+ heat_limit = H.species.heat_level_3
+
+ if(pipe_air.temperature > heat_limit + 1)
+ buckled_mob.apply_damage(4 * log(pipe_air.temperature - heat_limit), BURN, "chest", used_weapon = "Excessive Heat")
+
+ //fancy radiation glowing
+ if(pipe_air.temperature && (icon_temperature > 500 || pipe_air.temperature > 500)) //start glowing at 500K
+ if(abs(pipe_air.temperature - icon_temperature) > 10)
+ icon_temperature = pipe_air.temperature
+
+ var/h_r = heat2color_r(icon_temperature)
+ var/h_g = heat2color_g(icon_temperature)
+ var/h_b = heat2color_b(icon_temperature)
+
+ if(icon_temperature < 2000) //scale up overlay until 2000K
+ var/scale = (icon_temperature - 500) / 1500
+ h_r = 64 + (h_r - 64)*scale
+ h_g = 64 + (h_g - 64)*scale
+ h_b = 64 + (h_b - 64)*scale
+
+ animate(src, color = rgb(h_r, h_g, h_b), time = 20, easing = SINE_EASING)
+
+
+
obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction
icon = 'icons/atmos/junction.dmi'
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index 16a0a6bcd5..be63292d83 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -12,6 +12,10 @@
var/alert_pressure = 80*ONE_ATMOSPHERE
//minimum pressure before check_pressure(...) should be called
+ can_buckle = 1
+ buckle_require_restraints = 1
+ buckle_lying = -1
+
/obj/machinery/atmospherics/pipe/drain_power()
return -1
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index cfac858e25..87b63f7120 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -194,7 +194,7 @@ proc/tg_list2text(list/list, glue=",")
. += copytext(text, last_found, found)
last_found = found + delim_len
while(found)
-
+
/proc/text2numlist(text, delimiter="\n")
var/list/num_list = list()
for(var/x in text2list(text, delimiter))
@@ -339,3 +339,31 @@ proc/tg_list2text(list/list, glue=",")
if("Orange") return 'icons/mob/screen1_Orange.dmi'
if("Midnight") return 'icons/mob/screen1_Midnight.dmi'
else return 'icons/mob/screen1_White.dmi'
+
+//adapted from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/
+/proc/heat2color(temp)
+ return rgb(heat2color_r(temp), heat2color_g(temp), heat2color_b(temp))
+
+/proc/heat2color_r(temp)
+ temp /= 100
+ if(temp <= 66)
+ . = 255
+ else
+ . = max(0, min(255, 329.698727446 * (temp - 60) ** -0.1332047592))
+
+/proc/heat2color_g(temp)
+ temp /= 100
+ if(temp <= 66)
+ . = max(0, min(255, 99.4708025861 * log(temp) - 161.1195681661))
+ else
+ . = max(0, min(255, 288.1221695283 * ((temp - 60) ** -0.0755148492)))
+
+/proc/heat2color_b(temp)
+ temp /= 100
+ if(temp >= 66)
+ . = 255
+ else
+ if(temp <= 16)
+ . = 0
+ else
+ . = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307))
diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm
index b2ced9fa0d..f30d55455b 100644
--- a/code/datums/spells/area_teleport.dm
+++ b/code/datums/spells/area_teleport.dm
@@ -47,7 +47,7 @@
return
if(target && target.buckled)
- target.buckled.unbuckle()
+ target.buckled.unbuckle_mob()
var/list/tempL = L
var/attempt = null
diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm
index 1b1646ffa4..b5744dffc4 100644
--- a/code/datums/spells/ethereal_jaunt.dm
+++ b/code/datums/spells/ethereal_jaunt.dm
@@ -20,7 +20,7 @@
if(target.buckled)
var/obj/structure/stool/bed/buckled_to = target.buckled.
- buckled_to.unbuckle()
+ buckled_to.unbuckle_mob()
var/mobloc = get_turf(target.loc)
var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc )
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 4d192c5dd9..2b577a469a 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -282,7 +282,7 @@ Class Procs:
src.add_fingerprint(user)
- return 0
+ return ..()
/obj/machinery/proc/RefreshParts() //Placeholder proc for machines that are built using frames.
return
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
new file mode 100644
index 0000000000..f0f5a53aea
--- /dev/null
+++ b/code/game/objects/buckling.dm
@@ -0,0 +1,86 @@
+/obj
+ var/can_buckle = 0
+ var/buckle_movable = 0
+ var/buckle_lying = -1 //bed-like behavior, forces mob.lying = buckle_lying if != -1
+ var/buckle_require_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes
+ var/mob/living/buckled_mob = null
+
+/obj/attack_hand(mob/living/user)
+ . = ..()
+ if(can_buckle && buckled_mob)
+ user_unbuckle_mob(user)
+
+/obj/MouseDrop_T(mob/living/M, mob/living/user)
+ . = ..()
+ if(can_buckle && istype(M))
+ user_buckle_mob(M, user)
+
+/obj/Del()
+ unbuckle_mob()
+ return ..()
+
+/obj/proc/buckle_mob(mob/living/M)
+ if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || M.pinned.len || (buckle_require_restraints && !M.restrained()))
+ return 0
+
+ M.buckled = src
+ M.set_dir(dir)
+ M.update_canmove()
+ buckled_mob = M
+ post_buckle_mob(M)
+ return 1
+
+/obj/proc/unbuckle_mob()
+ if(buckled_mob && buckled_mob.buckled == src)
+ . = buckled_mob
+ buckled_mob.buckled = null
+ buckled_mob.anchored = initial(buckled_mob.anchored)
+ buckled_mob.update_canmove()
+ buckled_mob = null
+
+ post_buckle_mob(.)
+
+/obj/proc/post_buckle_mob(mob/living/M)
+ return
+
+/obj/proc/user_buckle_mob(mob/living/M, mob/user)
+ if(!ticker)
+ user << "You can't buckle anyone in before the game starts."
+ if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat || istype(user, /mob/living/silicon/pai))
+ return
+
+ if(istype(M, /mob/living/carbon/slime))
+ user << "The [M] is too squishy to buckle in."
+ return
+
+ add_fingerprint(user)
+ unbuckle_mob()
+
+ if(buckle_mob(M))
+ if(M == user)
+ M.visible_message(\
+ "[M.name] buckles themselves to [src].",\
+ "You buckle yourself to [src].",\
+ "You hear metal clanking.")
+ else
+ M.visible_message(\
+ "[M.name] is buckled to [src] by [user.name]!",\
+ "You are buckled to [src] by [user.name]!",\
+ "You hear metal clanking.")
+
+/obj/proc/user_unbuckle_mob(mob/user)
+ var/mob/living/M = unbuckle_mob()
+ world << 3
+ if(M)
+ if(M != user)
+ M.visible_message(\
+ "[M.name] was unbuckled by [user.name]!",\
+ "You were unbuckled from [src] by [user.name].",\
+ "You hear metal clanking.")
+ else
+ M.visible_message(\
+ "[M.name] unbuckled themselves!",\
+ "You unbuckle yourself from [src].",\
+ "You hear metal clanking.")
+ add_fingerprint(user)
+ return M
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm
index d7be368665..d32ae9d8ba 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implantfreedom.dm
@@ -23,6 +23,8 @@
if (source.handcuffed)
var/obj/item/weapon/W = source.handcuffed
source.handcuffed = null
+ if(source.buckled && source.buckled.buckle_require_restraints)
+ source.buckled.unbuckle_mob()
source.update_inv_handcuffed()
if (source.client)
source.client.screen -= W
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index 1ece5817f9..92ba323a6a 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -69,7 +69,7 @@
return
if(user && user.buckled)
- user.buckled.unbuckle()
+ user.buckled.unbuckle_mob()
var/list/tempL = L
var/attempt = null
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 14f9ad482a..d3f797e2f0 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -119,6 +119,8 @@
"You cut \the [C]'s restraints with \the [src]!",\
"You hear cable being cut.")
C.handcuffed = null
+ if(C.buckled && C.buckled.buckle_require_restraints)
+ C.buckled.unbuckle_mob()
C.update_inv_handcuffed()
return
else
@@ -531,4 +533,4 @@
if(!resolved && tool && target)
tool.afterattack(target,user,1)
if(tool)
- tool.loc = src*/
+ tool.loc = src*/
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index d105caae00..a23bb65cf8 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -20,7 +20,7 @@
var/mob/living/carbon/human/H = user
if(H.species.can_shred(user))
attack_generic(user,1,"slices")
- return
+ return ..()
/obj/structure/blob_act()
if(prob(50))
@@ -67,10 +67,10 @@
/obj/structure/MouseDrop_T(mob/target, mob/user)
var/mob/living/H = user
- if(!istype(H) || target != user) // No making other people climb onto tables.
- return
-
- do_climb(target)
+ if(istype(H) && can_climb(H) && target == user)
+ do_climb(target)
+ else
+ return ..()
/obj/structure/proc/can_climb(var/mob/living/user)
if (!can_touch(user) || !climbable)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 0b542dd2bb..836b35ca02 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -211,7 +211,7 @@
/obj/structure/stool/bed/chair/janicart/relaymove(mob/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis)
- unbuckle()
+ unbuckle_mob()
if(istype(user.l_hand, /obj/item/key) || istype(user.r_hand, /obj/item/key))
step(src, direction)
update_mob()
@@ -226,22 +226,9 @@
buckled_mob.loc = loc
-/obj/structure/stool/bed/chair/janicart/buckle_mob(mob/M, mob/user)
- if(M != user || !ismob(M) || get_dist(src, user) > 1 || user.restrained() || user.lying || user.stat || M.buckled || istype(user, /mob/living/silicon))
- return
-
- unbuckle()
-
- M.visible_message(\
- "[M] climbs onto the [callme]!",\
- "You climb onto the [callme]!")
- M.buckled = src
- M.loc = loc
- M.set_dir(dir)
- M.update_canmove()
- buckled_mob = M
+/obj/structure/stool/bed/chair/janicart/post_buckle_mob(mob/living/M)
update_mob()
- add_fingerprint(user)
+ return ..()
/obj/structure/stool/bed/chair/janicart/update_layer()
@@ -251,11 +238,12 @@
layer = OBJ_LAYER
-/obj/structure/stool/bed/chair/janicart/unbuckle()
- if(buckled_mob)
- buckled_mob.pixel_x = 0
- buckled_mob.pixel_y = 0
- ..()
+/obj/structure/stool/bed/chair/janicart/unbuckle_mob()
+ var/mob/living/M = ..()
+ if(M)
+ M.pixel_x = 0
+ M.pixel_y = 0
+ return M
/obj/structure/stool/bed/chair/janicart/set_dir()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
index e67fea3849..451bfd8b3e 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm
@@ -8,7 +8,7 @@
icon_state = "nest"
var/health = 100
-/obj/structure/stool/bed/nest/manual_unbuckle(mob/user as mob)
+/obj/structure/stool/bed/nest/user_unbuckle_mob(mob/user as mob)
if(buckled_mob)
if(buckled_mob.buckled == src)
if(buckled_mob != user)
@@ -18,7 +18,7 @@
"You hear squelching...")
buckled_mob.pixel_y = 0
buckled_mob.old_y = 0
- unbuckle()
+ unbuckle_mob()
else
if(world.time <= buckled_mob.last_special+NEST_RESIST_TIME)
return
@@ -32,16 +32,15 @@
buckled_mob.last_special = world.time
buckled_mob.pixel_y = 0
buckled_mob.old_y = 0
- unbuckle()
+ unbuckle_mob()
src.add_fingerprint(user)
return
-/obj/structure/stool/bed/nest/buckle_mob(mob/M as mob, mob/user as mob)
-
+/obj/structure/stool/bed/nest/user_buckle_mob(mob/M as mob, mob/user as mob)
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || usr.stat || M.buckled || istype(user, /mob/living/silicon/pai) )
return
- unbuckle()
+ unbuckle_mob()
var/mob/living/carbon/xenos = user
var/mob/living/carbon/victim = M
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 8902dbc8ec..cd8d78c4c6 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -11,8 +11,10 @@
name = "bed"
desc = "This is used to lie in, sleep in or strap on."
icon_state = "bed"
- var/mob/living/buckled_mob
- var/movable = 0 // For mobility checks
+ can_buckle = 1
+ buckle_lying = 1
+ //var/mob/living/buckled_mob
+ //var/movable = 0 // For mobility checks
/obj/structure/stool/bed/psych
name = "psychiatrists couch"
@@ -24,7 +26,7 @@
desc = "This looks similar to contraptions from earth. Could aliens be stealing our technology?"
icon_state = "abed"
-/obj/structure/stool/bed/Del()
+/*/obj/structure/stool/bed/Del()
unbuckle()
..()
return
@@ -80,7 +82,7 @@
/obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob)
if (!ticker)
user << "You can't buckle anyone in before the game starts."
- if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.lying || user.stat || M.buckled || M.pinned.len || istype(user, /mob/living/silicon/pai) )
+ if (!ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.lying || user.stat || M.buckled || M.pinned.len || istype(user, /mob/living/silicon/pai) )
return
if (istype(M, /mob/living/carbon/slime))
@@ -106,7 +108,7 @@
src.buckled_mob = M
src.add_fingerprint(user)
afterbuckle(M)
- return
+ return*/
/*
* Roller beds
@@ -120,7 +122,7 @@
/obj/structure/stool/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/roller_holder))
if(buckled_mob)
- manual_unbuckle()
+ user_unbuckle_mob(user)
else
visible_message("[user] collapses \the [src.name].")
new/obj/item/roller(get_turf(src))
@@ -185,29 +187,19 @@
else
buckled_mob = null
-/obj/structure/stool/bed/roller/buckle_mob(mob/M as mob, mob/user as mob)
- if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.restrained() || user.lying || user.stat || M.buckled || istype(usr, /mob/living/silicon/pai) )
- return
- M.pixel_y = 6
- M.old_y = 6
- density = 1
- icon_state = "up"
- ..()
- return
+/obj/structure/stool/bed/roller/post_buckle_mob(mob/living/M as mob)
+ if(M == buckled_mob)
+ M.pixel_y = 6
+ M.old_y = 6
+ density = 1
+ icon_state = "up"
+ else
+ buckled_mob.pixel_y = 0
+ buckled_mob.old_y = 0
+ density = 0
+ icon_state = "down"
-/obj/structure/stool/bed/roller/manual_unbuckle(mob/user as mob)
- if(buckled_mob)
- if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
- buckled_mob.pixel_y = 0
- buckled_mob.old_y = 0
- buckled_mob.anchored = initial(buckled_mob.anchored)
- buckled_mob.buckled = null
- buckled_mob.update_canmove()
- buckled_mob = null
- density = 0
- icon_state = "down"
- ..()
- return
+ return ..()
/obj/structure/stool/bed/roller/MouseDrop(over_object, src_location, over_location)
..()
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 16d84f6aad..55f3e36398 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -2,12 +2,10 @@
name = "chair"
desc = "You sit in this. Either by will or force."
icon_state = "chair"
+ buckle_lying = 0 //force people to sit up in chairs when buckled
var/propelled = 0 // Check for fire-extinguisher-driven chairs
-/obj/structure/stool/MouseDrop(atom/over_object)
- return
-
/obj/structure/stool/bed/chair/New()
..()
spawn(3) //sorry. i don't think there's a better way to do this.
@@ -68,11 +66,6 @@
src.set_dir(turn(src.dir, 90))
return
-/obj/structure/stool/bed/chair/MouseDrop_T(mob/M as mob, mob/user as mob)
- if(!istype(M)) return
- buckle_mob(M, user)
- return
-
// Chair types
/obj/structure/stool/bed/chair/wood/normal
icon_state = "wooden_chair"
@@ -105,7 +98,7 @@
return ..()
-/obj/structure/stool/bed/chair/comfy/afterbuckle()
+/obj/structure/stool/bed/chair/comfy/post_buckle_mob()
if(buckled_mob)
overlays += armrest
else
@@ -122,7 +115,7 @@
/obj/structure/stool/bed/chair/office
anchored = 0
- movable = 1
+ buckle_movable = 1
/obj/structure/stool/bed/chair/comfy/black
color = rgb(167,164,153)
@@ -143,15 +136,14 @@
if (O != occupant)
Bump(O)
else
- unbuckle()
+ unbuckle_mob()
/obj/structure/stool/bed/chair/office/Bump(atom/A)
..()
if(!buckled_mob) return
if(propelled)
- var/mob/living/occupant = buckled_mob
- unbuckle()
+ var/mob/living/occupant = unbuckle_mob()
var/def_zone = ran_zone()
var/blocked = occupant.run_armor_check(def_zone, "melee")
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index 027d382795..dce74304ec 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -34,7 +34,7 @@
return
/obj/structure/stool/MouseDrop(atom/over_object)
- if (istype(over_object, /mob/living/carbon/human))
+ if(istype(over_object, /mob/living/carbon/human) && type == /obj/structure/stool) //i am sorry for this, but the inheritance mess requires it
var/mob/living/carbon/human/H = over_object
if (H==usr && !H.restrained() && !H.stat && in_range(src, over_object))
var/obj/item/weapon/stool/S = new/obj/item/weapon/stool()
@@ -42,6 +42,8 @@
src.loc = S
H.put_in_hands(S)
H.visible_message("\red [H] grabs [src] from the floor!", "\red You grab [src] from the floor!")
+ return
+ return ..()
/obj/item/weapon/stool
name = "stool"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index 59a819b8b9..d07f1a33cb 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -3,7 +3,7 @@
desc = "You sit in this. Either by will or force."
icon_state = "wheelchair"
anchored = 0
- movable = 1
+ buckle_movable = 1
var/driving = 0
var/mob/living/pulling = null
@@ -93,7 +93,7 @@
if (O != occupant)
Bump(O)
else
- unbuckle()
+ unbuckle_mob()
if (pulling && (get_dist(src, pulling) > 1))
pulling.pulledby = null
pulling << "\red You lost your grip!"
@@ -102,11 +102,11 @@
if (occupant && (src.loc != occupant.loc))
src.loc = occupant.loc // Failsafe to make sure the wheelchair stays beneath the occupant after driving
-/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/user as mob)
+/obj/structure/stool/bed/chair/wheelchair/attack_hand(mob/living/user as mob)
if (pulling)
MouseDrop(usr)
else
- manual_unbuckle(user)
+ user_unbuckle_mob(user)
return
/obj/structure/stool/bed/chair/wheelchair/MouseDrop(over_object, src_location, over_location)
@@ -138,8 +138,7 @@
if(!buckled_mob) return
if(propelled || (pulling && (pulling.a_intent == "hurt")))
- var/mob/living/occupant = buckled_mob
- unbuckle()
+ var/mob/living/occupant = unbuckle_mob()
if (pulling && (pulling.a_intent == "hurt"))
occupant.throw_at(A, 3, 3, pulling)
diff --git a/code/modules/hydroponics/vines.dm b/code/modules/hydroponics/vines.dm
index 699063fec4..24e7502669 100644
--- a/code/modules/hydroponics/vines.dm
+++ b/code/modules/hydroponics/vines.dm
@@ -20,7 +20,6 @@
// Life vars/
var/energy = 0
var/obj/effect/plant_controller/master = null
- var/mob/living/buckled_mob
var/datum/seed/seed
/obj/effect/plantsegment/New()
@@ -56,7 +55,7 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user)) del src
else
- manual_unbuckle(user)
+ user_unbuckle_mob(user)
return
// Plant-b-gone damage is handled in its entry in chemistry-reagents.dm
..()
@@ -71,39 +70,7 @@
update()
return
- manual_unbuckle(user)
-
-/obj/effect/plantsegment/proc/unbuckle()
- if(buckled_mob)
- if(buckled_mob.buckled == src) //this is probably unneccesary, but it doesn't hurt
- buckled_mob.buckled = null
- buckled_mob.anchored = initial(buckled_mob.anchored)
- buckled_mob.update_canmove()
- buckled_mob = null
- return
-
-/obj/effect/plantsegment/proc/manual_unbuckle(mob/user as mob)
- if(buckled_mob)
- if(prob(seed ? min(max(0,100 - seed.potency),100) : 50))
- if(buckled_mob.buckled == src)
- if(buckled_mob != user)
- buckled_mob.visible_message(\
- "[user.name] frees [buckled_mob.name] from [src].",\
- "[user.name] frees you from [src].",\
- "You hear shredding and ripping.")
- else
- buckled_mob.visible_message(\
- "[buckled_mob.name] struggles free of [src].",\
- "You untangle [src] from around yourself.",\
- "You hear shredding and ripping.")
- unbuckle()
- else
- var/text = pick("rips","tears","pulls")
- user.visible_message(\
- "[user.name] [text] at [src].",\
- "You [text] at [src].",\
- "You hear shredding and ripping.")
- return
+ user_unbuckle_mob(user)
/obj/effect/plantsegment/proc/grow()
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index b1170468d8..4431ccdf80 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -354,6 +354,8 @@
else if (W == handcuffed)
handcuffed = null
update_inv_handcuffed()
+ if(buckled && buckled.buckle_require_restraints)
+ buckled.unbuckle_mob()
else if (W == legcuffed)
legcuffed = null
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 777c17fdbc..7147b85765 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -131,6 +131,10 @@
else
msg += "[t_He] [t_is] \icon[handcuffed] handcuffed!\n"
+ //buckled
+ if(buckled)
+ msg += "[t_He] [t_is] \icon[buckled] buckled to [buckled]!\n"
+
//belt
if(belt)
if(belt.blood_DNA)
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 0a504ca148..8516b11a7f 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -167,6 +167,8 @@
update_inv_back()
else if (W == handcuffed)
handcuffed = null
+ if(buckled && buckled.buckle_require_restraints)
+ buckled.unbuckle_mob()
success = 1
update_inv_handcuffed()
else if (W == legcuffed)
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 5e37b53247..943f90bcca 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -56,7 +56,7 @@
var/cold_level_3 = 120 // Cold damage level 3 below this point.
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
- var/heat_level_3 = 1000 // Heat damage level 2 above this point.
+ var/heat_level_3 = 1000 // Heat damage level 3 above this point.
var/synth_temp_gain = 0 // IS_SYNTHETIC species will gain this much temperature every second
var/hazard_high_pressure = HAZARD_HIGH_PRESSURE // Dangerously high pressure.
var/warning_high_pressure = WARNING_HIGH_PRESSURE // High pressure warning.
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index b9f898ab5d..79537ae833 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -555,9 +555,9 @@
for(var/mob/O in viewers(C))
O.show_message("\red [usr] manages to unbuckle themself!", 1)
C << "\blue You successfully unbuckle yourself."
- C.buckled.manual_unbuckle(C)
+ C.buckled.user_unbuckle_mob(C)
else
- L.buckled.manual_unbuckle(L)
+ L.buckled.user_unbuckle_mob(L)
//Breaking out of a locker?
else if( src.loc && (istype(src.loc, /obj/structure/closet)) )
@@ -657,6 +657,8 @@
CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
del(CM.handcuffed)
CM.handcuffed = null
+ if(buckled && buckled.buckle_require_restraints)
+ buckled.unbuckle_mob()
CM.update_inv_handcuffed()
else
var/obj/item/weapon/handcuffs/HC = CM.handcuffed
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index d12af10dd0..15347c2580 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -853,21 +853,17 @@ note dizziness decrements automatically in the mob's Life() proc.
canmove = 0
pixel_y = V.mob_offset_y - 5
else
- lying = 0
+ if(buckled.buckle_lying != -1) lying = buckled.buckle_lying
canmove = 1
pixel_y = V.mob_offset_y
else if(buckled)
- if (!buckled.movable)
+ if(buckled.buckle_lying != -1) lying = buckled.buckle_lying
+ if (!buckled.buckle_movable)
anchored = 1
canmove = 0
- if(istype(buckled,/obj/structure/stool/bed/chair) )
- lying = 0
- else
- lying = 1
else
anchored = 0
canmove = 1
- lying = 0
else if( stat || weakened || paralysis || resting || sleeping || (status_flags & FAKEDEATH))
lying = 1
canmove = 0
@@ -904,7 +900,7 @@ note dizziness decrements automatically in the mob's Life() proc.
if(!canface() || client.moving || world.time < client.move_delay)
return 0
set_dir(ndir)
- if(buckled && buckled.movable)
+ if(buckled && buckled.buckle_movable)
buckled.set_dir(ndir)
client.move_delay += movement_delay()
return 1
diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
index 8eca5f355d..b8d1c9a87c 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
+++ b/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
@@ -8,7 +8,7 @@
if(prob(100 * weakness))
user << "\red You are suddenly zapped away elsewhere!"
if (user.buckled)
- user.buckled.unbuckle()
+ user.buckled.unbuckle_mob()
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(user))
@@ -28,7 +28,7 @@
if(prob(100 * weakness))
M << "\red You are displaced by a strange force!"
if(M.buckled)
- M.buckled.unbuckle()
+ M.buckled.unbuckle_mob()
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(M))
@@ -47,7 +47,7 @@
if(prob(100 * weakness))
M << "\red You are displaced by a strange force!"
if(M.buckled)
- M.buckled.unbuckle()
+ M.buckled.unbuckle_mob()
var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
sparks.set_up(3, 0, get_turf(M))
diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm
index 072423d496..24f1542219 100644
--- a/code/modules/vehicles/vehicle.dm
+++ b/code/modules/vehicles/vehicle.dm
@@ -13,6 +13,10 @@
animate_movement=1
luminosity = 3
+ can_buckle = 1
+ buckle_movable = 1
+ buckle_lying = 0
+
var/attack_log = null
var/on = 0
var/health = 0 //do not forget to set health for your vehicle!
@@ -25,7 +29,6 @@
var/emagged = 0
var/powered = 0 //set if vehicle is powered and should use fuel when moving
var/move_delay = 1 //set this to limit the speed of the vehicle
- var/movable = 1
var/obj/item/weapon/cell/cell
var/charge_use = 5 //set this to adjust the amount of power the vehicle uses per move
@@ -298,9 +301,7 @@
C.layer = layer + 0.1 //so it sits above the vehicle
if(ismob(C))
- var/mob/M = C
- M.buckled = src
- M.update_canmove()
+ buckle_mob(C)
return 1
@@ -343,10 +344,7 @@
load.layer = initial(load.layer)
if(ismob(load))
- var/mob/M = load
- M.buckled = null
- M.anchored = initial(M.anchored)
- M.update_canmove()
+ unbuckle_mob(load)
load = null
diff --git a/icons/atmos/heat.dmi b/icons/atmos/heat.dmi
index 6d1ed47e7e..1014c2015b 100644
Binary files a/icons/atmos/heat.dmi and b/icons/atmos/heat.dmi differ
diff --git a/icons/atmos/junction.dmi b/icons/atmos/junction.dmi
index 70286bde15..892f5823f2 100644
Binary files a/icons/atmos/junction.dmi and b/icons/atmos/junction.dmi differ