From 19a981e96101f149e70277a2fc8bf69003b1754b Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Sun, 26 Apr 2015 19:15:42 +0200 Subject: [PATCH] Airlocks can now crush more things. Airlocks can now crush mobs, canisters, closets, and mechas. Fixes #8983. --- code/game/machinery/doors/airlock.dm | 77 ++++++++++++------- code/game/machinery/doors/door.dm | 7 +- code/game/mecha/mecha.dm | 3 + .../structures/crates_lockers/closets.dm | 13 ++-- .../PsiOmegaDelta-AirlockPressure.yml | 4 + 5 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 html/changelogs/PsiOmegaDelta-AirlockPressure.yml diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5c6a744d5d..ef6a986ac0 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -856,40 +856,65 @@ About the new airlock wires panel: return ..() +/atom/movable/proc/blocks_airlock() + return density + +/obj/machinery/door/blocks_airlock() + return 0 + +/mob/living/blocks_airlock() + return 1 + +/atom/movable/proc/airlock_crush(var/crush_damage) + return + +/obj/machinery/portable_atmospherics/canister/airlock_crush(var/crush_damage) + health -= crush_damage + healthcheck() + +/obj/structure/closet/airlock_crush(var/crush_damage) + damage(crush_damage) + for(var/atom/movable/AM in src) + AM.airlock_crush() + +/mob/living/airlock_crush(var/crush_damage) + adjustBruteLoss(crush_damage) + SetStunned(5) + SetWeakened(5) + var/obj/effect/stop/S + S = new /obj/effect/stop + S.victim = src + S.loc = loc + spawn(20) + qdel(S) + var/turf/T = get_turf(src) + T.add_blood(src) + +/mob/living/carbon/airlock_crush(var/crush_damage) + ..() + if (!(species && (species.flags & NO_PAIN))) + emote("scream") + +/mob/living/silicon/robot/airlock_crush(var/crush_damage) + adjustBruteLoss(crush_damage) + /obj/machinery/door/airlock/close(var/forced=0) if(!can_close(forced)) return 0 if(safe) for(var/turf/turf in locs) - if(locate(/mob/living) in turf) - if(world.time > next_beep_at) - playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) - next_beep_at = world.time + SecondsToTicks(10) - close_door_at = world.time + 6 - return + for(var/atom/movable/AM in turf) + if(AM.blocks_airlock()) + if(world.time > next_beep_at) + playsound(src.loc, 'sound/machines/buzz-two.ogg', 50, 0) + next_beep_at = world.time + SecondsToTicks(10) + close_door_at = world.time + 6 + return for(var/turf/turf in locs) - for(var/mob/living/M in turf) - if(isrobot(M)) - M.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - else - M.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - M.SetStunned(5) - M.SetWeakened(5) - var/obj/effect/stop/S - S = new /obj/effect/stop - S.victim = M - S.loc = M.loc - spawn(20) - qdel(S) - if (iscarbon(M)) - var/mob/living/carbon/C = M - if (!(C.species && (C.species.flags & NO_PAIN))) - M.emote("scream") - var/turf/location = src.loc - if(istype(location, /turf/simulated)) - location.add_blood(M) + for(var/atom/movable/AM in turf) + AM.airlock_crush(DOOR_CRUSH_DAMAGE) use_power(360) //360 W seems much more appropriate for an actuator moving an industrial door capable of crushing people if(istype(src, /obj/machinery/door/airlock/glass)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 4ebc32b38e..02b022e674 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -388,7 +388,9 @@ /obj/machinery/door/proc/open(var/forced = 0) - if(!can_open(forced)) return + if(!can_open(forced)) + return + operating = 1 do_animate("opening") icon_state = "door0" @@ -401,8 +403,7 @@ update_icon() SetOpacity(0) update_nearby_tiles() - - if(operating) operating = 0 + operating = 0 if(autoclose) close_door_at = next_close_time() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 86d84b4527..515c01841a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -497,6 +497,9 @@ /obj/mecha/proc/dynabsorbdamage(damage,damage_type) return damage*(listgetindex(damage_absorption,damage_type) || 1) +/obj/mecha/airlock_crush(var/crush_damage) + take_damage(crush_damage) + check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) /obj/mecha/proc/update_health() if(src.health > 0) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 07ede680ac..f3cc2a4028 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -160,16 +160,19 @@ A.ex_act(severity++) qdel(src) +/obj/structure/closet/proc/damage(var/damage) + health -= damage + if(health <= 0) + for(var/atom/movable/A in src) + A.loc = src.loc + qdel(src) + /obj/structure/closet/bullet_act(var/obj/item/projectile/Proj) if(!(Proj.damage_type == BRUTE || Proj.damage_type == BURN)) return - health -= Proj.damage ..() - if(health <= 0) - for(var/atom/movable/A as mob|obj in src) - A.loc = src.loc - qdel(src) + damage(Proj.damage) return diff --git a/html/changelogs/PsiOmegaDelta-AirlockPressure.yml b/html/changelogs/PsiOmegaDelta-AirlockPressure.yml new file mode 100644 index 0000000000..0f64ac3bd2 --- /dev/null +++ b/html/changelogs/PsiOmegaDelta-AirlockPressure.yml @@ -0,0 +1,4 @@ +author: PsiOmegaDelta +changes: + - rscadd: "Beware. Airlocks can now crush more things than just mobs." +delete-after: True