From 537b78fc80d9b89db5fc39332044c94cc9062e01 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Mon, 12 Jan 2015 21:13:24 +0000 Subject: [PATCH 1/2] refactor buckling to be more generic Buckling procs and vars have been moved down to /obj. Behaviour is mostly the same, but you can buckle cuffed people to pipes and they will automatically unbuckle if the cuffs are removed. Signed-off-by: Mloc-Argent --- baystation12.dme | 1 + code/ATMOSPHERICS/pipes.dm | 4 + code/datums/spells/area_teleport.dm | 2 +- code/datums/spells/ethereal_jaunt.dm | 2 +- code/game/machinery/machinery.dm | 2 +- code/game/objects/buckling.dm | 86 +++++++++++++++++++ .../items/weapons/implants/implantfreedom.dm | 2 + code/game/objects/items/weapons/scrolls.dm | 2 +- code/game/objects/items/weapons/tools.dm | 4 +- code/game/objects/structures.dm | 10 +-- code/game/objects/structures/janicart.dm | 30 ++----- .../stool_bed_chair_nest/alien_nests.dm | 11 ++- .../structures/stool_bed_chair_nest/bed.dm | 48 +++++------ .../structures/stool_bed_chair_nest/chairs.dm | 18 ++-- .../structures/stool_bed_chair_nest/stools.dm | 4 +- .../stool_bed_chair_nest/wheelchair.dm | 11 ++- code/modules/hydroponics/vines.dm | 37 +------- code/modules/mob/living/carbon/carbon.dm | 2 + .../mob/living/carbon/human/examine.dm | 4 + .../mob/living/carbon/human/inventory.dm | 2 + code/modules/mob/living/living.dm | 6 +- code/modules/mob/mob.dm | 12 +-- .../effects/unknown_effect_teleport.dm | 6 +- code/modules/vehicles/vehicle.dm | 14 ++- 24 files changed, 179 insertions(+), 141 deletions(-) create mode 100644 code/game/objects/buckling.dm diff --git a/baystation12.dme b/baystation12.dme index f0a68647ed..0dd67ca117 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -456,6 +456,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/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/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 1a3cce2cf9..bfef200306 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -278,7 +278,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 e9aa6f3ca6..4a0b80d9fd 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -70,7 +70,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 62793f0b2c..6a3e839a0e 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 f412467c65..2db5b8e738 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -35,7 +35,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() @@ -43,6 +43,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 b25c03080e..d5b07d29cc 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 cac59fc767..f72ee8136c 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 545fa41c03..673744975c 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/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 5088f98108..869f98923a 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -855,21 +855,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 @@ -905,7 +901,7 @@ note dizziness decrements automatically in the mob's Life() proc. /mob/proc/facedir(var/ndir) if(!canface()) 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 df2286f70e..85e923e08c 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 From 70f67409d548eebbca6c8cd01d8bac3d43791a8d Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Mon, 12 Jan 2015 21:22:22 +0000 Subject: [PATCH 2/2] HE pipe changes HE pipes will now change colour as they heat up, the procs for calculating this are in type2type.dm. Mobs buckled to HE pipes will be forced to lie down and will share heat with and get burned by the pipe network. Signed-off-by: Mloc-Argent --- code/ATMOSPHERICS/he_pipes.dm | 43 +++++++++++++++++- code/__HELPERS/type2type.dm | 30 +++++++++++- .../living/carbon/human/species/species.dm | 2 +- icons/atmos/heat.dmi | Bin 4949 -> 4827 bytes icons/atmos/junction.dmi | Bin 2847 -> 2799 bytes 5 files changed, 71 insertions(+), 4 deletions(-) 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/__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/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 8bdfa8a59d..edbb204be2 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/icons/atmos/heat.dmi b/icons/atmos/heat.dmi index 6d1ed47e7ef869a5947c3f9a26f0d36a4ca1615f..1014c2015b0530e63190c50fd363fdf51ae96873 100644 GIT binary patch literal 4827 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 literal 4949 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 diff --git a/icons/atmos/junction.dmi b/icons/atmos/junction.dmi index 70286bde155d30de04911477296cdde32faa7b1d..892f5823f2e512291e3bb0a5c4a49afb33370d74 100644 GIT binary patch delta 2791 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 delta 2840 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