From e9dd848cf16bb4c47212e4c53c455b771241a336 Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 10 Jul 2016 03:00:25 -0400 Subject: [PATCH] Freezer Fixes Freezer crates, freezer boxes, cryobags, and medical grippers now properly preserve organs, as well as organs attached to organs. Cleans up storage.dm slightly by removing loc setting with forceMove(), for the above to work. --- code/game/objects/items/bodybag.dm | 12 ++++++ .../objects/items/weapons/storage/boxes.dm | 16 ++++++++ .../objects/items/weapons/storage/storage.dm | 8 ++-- .../structures/crates_lockers/crates.dm | 38 +++++++++++++------ .../living/silicon/robot/drone/drone_items.dm | 16 ++++++++ code/modules/organs/organ.dm | 3 +- 6 files changed, 77 insertions(+), 16 deletions(-) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 88b513e06e7..b154cd0468c 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -155,12 +155,24 @@ var/mob/living/carbon/human/H = AM H.in_stasis = 1 src.used = 1 + + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 1 + for(var/obj/item/organ/organ in O) + organ.preserved = 1 ..() /obj/structure/closet/body_bag/cryobag/Exited(atom/movable/AM) if(ishuman(AM)) var/mob/living/carbon/human/H = AM H.in_stasis = 0 + + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 0 + for(var/obj/item/organ/organ in O) + organ.preserved = 0 ..() /obj/structure/closet/body_bag/cryobag/return_air() //Used to make stasis bags protect from vacuum. diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index a1b6e17b5a8..948faa4afe7 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -545,6 +545,22 @@ max_storage_space = 21 use_to_pickup = 1 // for picking up broken bulbs, not that most people will try +/obj/item/weapon/storage/box/freezer/Entered(var/atom/movable/AM) + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 1 + for(var/obj/item/organ/organ in O) + organ.preserved = 1 + ..() + +/obj/item/weapon/storage/box/freezer/Exited(var/atom/movable/AM) + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 0 + for(var/obj/item/organ/organ in O) + organ.preserved = 0 + ..() + /obj/item/weapon/storage/box/ambrosia name = "ambrosia seeds box" desc = "Contains the seeds you need to get a little high." diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 2df9701436a..8b3712e9068 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -348,7 +348,7 @@ if(usr) usr.remove_from_mob(W) usr.update_icons() //update our overlays - W.loc = src + W.forceMove(src) W.on_enter_storage(src) if(usr) if (usr.client && usr.s_active != src) @@ -391,9 +391,9 @@ W.layer = 20 else W.layer = initial(W.layer) - W.loc = new_location + W.forceMove(new_location) else - W.loc = get_turf(src) + W.forceMove(get_turf(src)) if(usr) src.orient2hud(usr) @@ -437,7 +437,7 @@ user << "The tray won't fit in [src]." return else - W.loc = user.loc + W.forceMove(get_turf(user)) if ((user.client && user.s_active != src)) user.client.screen -= W W.dropped(user) diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index d3e795edc3c..d6034bbb8af 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -331,18 +331,34 @@ var/target_temp = T0C - 40 var/cooling_power = 40 - return_air() - var/datum/gas_mixture/gas = (..()) - if(!gas) return null - var/datum/gas_mixture/newgas = new/datum/gas_mixture() - newgas.copy_from(gas) - if(newgas.temperature <= target_temp) return +/obj/structure/closet/crate/freezer/return_air() + var/datum/gas_mixture/gas = (..()) + if(!gas) return null + var/datum/gas_mixture/newgas = new/datum/gas_mixture() + newgas.copy_from(gas) + if(newgas.temperature <= target_temp) return - if((newgas.temperature - cooling_power) > target_temp) - newgas.temperature -= cooling_power - else - newgas.temperature = target_temp - return newgas + if((newgas.temperature - cooling_power) > target_temp) + newgas.temperature -= cooling_power + else + newgas.temperature = target_temp + return newgas + +/obj/structure/closet/crate/freezer/Entered(var/atom/movable/AM) + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 1 + for(var/obj/item/organ/organ in O) + organ.preserved = 1 + ..() + +/obj/structure/closet/crate/freezer/Exited(var/atom/movable/AM) + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 0 + for(var/obj/item/organ/organ in O) + organ.preserved = 0 + ..() /obj/structure/closet/crate/freezer/rations //Fpr use in the escape shuttle name = "emergency rations" diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index de680f0c918..84547eba188 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -101,6 +101,22 @@ /obj/item/organ ) +/obj/item/weapon/gripper/no_use/organ/Entered(var/atom/movable/AM) + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 1 + for(var/obj/item/organ/organ in O) + organ.preserved = 1 + ..() + +/obj/item/weapon/gripper/no_use/organ/Exited(var/atom/movable/AM) + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + O.preserved = 0 + for(var/obj/item/organ/organ in O) + organ.preserved = 0 + ..() + /obj/item/weapon/gripper/no_use/organ/robotics name = "external organ gripper" icon_state = "gripper-flesh" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 14842cb4f16..e1cf0cad9e2 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -28,6 +28,7 @@ var/list/organ_cache = list() var/min_broken_damage = 30 // Damage before becoming broken var/max_damage // Damage cap var/rejecting // Is this organ already being rejected? + var/preserved = 0 // If this is 1, prevents organ decay. /obj/item/organ/Destroy() @@ -100,7 +101,7 @@ var/list/organ_cache = list() // Don't process if we're in a freezer, an MMI or a stasis bag.or a freezer or something I dunno if(istype(loc,/obj/item/device/mmi)) return - if(istype(loc,/obj/structure/closet/body_bag/cryobag) || istype(loc,/obj/structure/closet/crate/freezer) || istype(loc,/obj/item/weapon/storage/box/freezer) || istype(loc,/obj/item/weapon/gripper/no_use/organ)) + if(preserved) return //Process infections if ((robotic >= ORGAN_ROBOT) || (owner && owner.species && (owner.species.flags & IS_PLANT)))