Airlocks can now crush more things.

Airlocks can now crush mobs, canisters, closets, and mechas.
Fixes #8983.
This commit is contained in:
PsiOmega
2015-04-26 19:15:42 +02:00
parent 8e0d0900d9
commit 19a981e961
5 changed files with 70 additions and 34 deletions

View File

@@ -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))

View File

@@ -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()

View File

@@ -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)

View File

@@ -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