diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 4d302c6749c..f62c78ccbcb 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -6,6 +6,7 @@ obj/machinery/door/airlock var/frequency var/shockedby = list() var/datum/radio_frequency/radio_connection + explosion_resistance = 15 receive_signal(datum/signal/signal) if(!signal || signal.encryption) return diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 27680b93cd8..fdbd1875b51 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -29,8 +29,10 @@ ..() if(density) layer = 3.1 //Above most items if closed + explosion_resistance = initial(explosion_resistance) else layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 + explosion_resistance = 0 update_nearby_tiles(need_rebuild=1) return @@ -208,6 +210,7 @@ sleep(10) src.layer = 2.7 src.density = 0 + explosion_resistance = 0 update_icon() // src.SetOpacity(0) update_nearby_tiles() @@ -231,6 +234,7 @@ animate("closing") src.density = 1 + explosion_resistance = initial(explosion_resistance) src.layer = 3.1 sleep(10) update_icon() @@ -321,4 +325,4 @@ else close() return -*/ +*/ \ No newline at end of file diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 60253441a26..f02f4644031 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/doors/rapid_pdoor.dmi' icon_state = "pdoor1" var/id = 1.0 + explosion_resistance = 25 /obj/machinery/door/poddoor/Bumped(atom/AM) if(!density) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index e37762fa488..ced6f902381 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -9,6 +9,7 @@ flags = ON_BORDER opacity = 0 var/obj/item/weapon/airlock_electronics/electronics = null + explosion_resistance = 5 /obj/machinery/door/window/update_nearby_tiles(need_rebuild) @@ -105,6 +106,7 @@ src.icon_state = text("[]open", src.base_state) sleep(10) + explosion_resistance = 0 src.density = 0 // src.sd_SetOpacity(0) //TODO: why is this here? Opaque windoors? ~Carn update_nearby_tiles() @@ -119,9 +121,10 @@ src.operating = 1 flick(text("[]closing", src.base_state), src) playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) - src.icon_state = text("[]", src.base_state) + src.icon_state = src.base_state src.density = 1 + explosion_resistance = initial(explosion_resistance) // if(src.visible) // SetOpacity(1) //TODO: why is this here? Opaque windoors? ~Carn update_nearby_tiles() diff --git a/code/game/objects/explosion_recursive.dm b/code/game/objects/explosion_recursive.dm index 3171db1fb38..07c6241503a 100644 --- a/code/game/objects/explosion_recursive.dm +++ b/code/game/objects/explosion_recursive.dm @@ -1,9 +1,11 @@ -/* - uncomment this to test it out! +/* - uncomment this to test it out! */ /mob/verb/kaboom() var/power = input(src, "power?", "power?") as num var/turf/T = get_turf(src) explosion_rec(T, power) -*/ + +/obj + var/explosion_resistance /datum/explosion_turf var/turf/turf //The turf which will get ex_act called on it @@ -58,7 +60,7 @@ proc/explosion_rec(turf/epicenter, power) //This steap handles the gathering of turfs which will be ex_act() -ed in the next step. It also ensures each turf gets the maximum possible amount of power dealt to it. for(var/direction in cardinal) var/turf/T = get_step(epicenter, direction) - T.explosion_spread(power - epicenter.explosion_resistance) + T.explosion_spread(power - epicenter.explosion_resistance, direction) //This step applies the ex_act effects for the explosion, as planned in the previous step. for( var/datum/explosion_turf/ET in explosion_turfs ) @@ -111,18 +113,40 @@ proc/explosion_rec(turf/epicenter, power) explosion_resistance = 25 //Code-wise, a safe value for power is something up to ~25 or ~30.. This does quite a bit of damage to the station. -/turf/proc/explosion_spread(power) +//direction is the direction that the spread took to come to this tile. So it is pointing in the main blast direction - meaning where this tile should spread most of it's force. +/turf/proc/explosion_spread(power, direction) if(power <= 0) return + /* + sleep(2) + new/obj/effect/debugging/marker(src) + */ + var/datum/explosion_turf/ET = get_explosion_turf(src) if(ET.max_power >= power) return //The turf already sustained and spread a power greated than what we are dealing with. No point spreading again. ET.max_power = power + var/spread_power = power - src.explosion_resistance //This is the amount of power that will be spread to the tile in the direction of the blast + var/side_spread_power = power - 2 * src.explosion_resistance //This is the amount of power that will be spread to the side tiles + for(var/obj/O in src) + if(O.explosion_resistance) + spread_power -= O.explosion_resistance + side_spread_power -= O.explosion_resistance + + var/turf/T = get_step(src, direction) + T.explosion_spread(spread_power, direction) + T = get_step(src, turn(direction,90)) + T.explosion_spread(side_spread_power, turn(direction,90)) + T = get_step(src, turn(direction,-90)) + T.explosion_spread(side_spread_power, turn(direction,90)) + + /* for(var/direction in cardinal) var/turf/T = get_step(src, direction) - T.explosion_spread(power - src.explosion_resistance) + T.explosion_spread(spread_power) + */ /turf/unsimulated/explosion_spread(power) return //So it doesn't get to the parent proc, which simulates explosions \ No newline at end of file diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 6498103be3b..7b4687bf478 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -12,9 +12,7 @@ layer = 2.9 var/health = 10 var/destroyed = 0 - proc - healthcheck() - shock(mob/user, prb) + explosion_resistance = 5 ex_act(severity) switch(severity) @@ -178,7 +176,7 @@ return - healthcheck() + proc/healthcheck() if (src.health <= 0) if (!( src.destroyed )) src.icon_state = "brokengrille" @@ -197,7 +195,7 @@ // shock user with probability prb (if all connections & power are working) // returns 1 if shocked, 0 otherwise - shock(mob/user, prb) + proc/shock(mob/user, prb) if(!anchored || destroyed) // anchored/destroyed grilles are never connected return 0 if(!prob(prb)) diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 94f3e3123c5..8834b4a6b78 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -44,6 +44,7 @@ var/list/mechtoys = list( density = 0 anchored = 1 layer = 4 + explosion_resistance = 5 /obj/structure/plasticflaps/CanPass(atom/A, turf/T) if(istype(A) && A.checkpass(PASSGLASS))