Merge pull request #3364 from Citadel-Station-13/upstream-merge-30909
[MIRROR] Radiation rework and subsystem
This commit is contained in:
+10
-4
@@ -75,12 +75,19 @@
|
||||
if (opacity && isturf(loc))
|
||||
var/turf/T = loc
|
||||
T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways.
|
||||
|
||||
ComponentInitialize()
|
||||
|
||||
return INITIALIZE_HINT_NORMAL
|
||||
|
||||
//called if Initialize returns INITIALIZE_HINT_LATELOAD
|
||||
/atom/proc/LateInitialize()
|
||||
return
|
||||
|
||||
// Put your AddComponent() calls here
|
||||
/atom/proc/ComponentInitialize()
|
||||
return
|
||||
|
||||
/atom/Destroy()
|
||||
if(alternate_appearances)
|
||||
for(var/K in alternate_appearances)
|
||||
@@ -478,19 +485,18 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons)
|
||||
|
||||
/atom/proc/acid_act(acidpwr, acid_volume)
|
||||
SendSignal(COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume)
|
||||
return
|
||||
|
||||
/atom/proc/emag_act()
|
||||
SendSignal(COMSIG_ATOM_EMAG_ACT)
|
||||
return
|
||||
|
||||
/atom/proc/rad_act(strength)
|
||||
SendSignal(COMSIG_ATOM_RAD_ACT)
|
||||
|
||||
/atom/proc/narsie_act()
|
||||
SendSignal(COMSIG_ATOM_NARSIE_ACT)
|
||||
return
|
||||
|
||||
/atom/proc/ratvar_act()
|
||||
SendSignal(COMSIG_ATOM_RATVAR_ACT)
|
||||
return
|
||||
|
||||
/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
return FALSE
|
||||
|
||||
@@ -268,7 +268,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
..()
|
||||
explosion(src.loc, 0, 0, 4, 3, 0)
|
||||
new /obj/effect/decal/cleanable/greenglow(get_turf(src))
|
||||
radiation_pulse(get_turf(src), 2, 5, 50, 1)
|
||||
radiation_pulse(get_turf(src), 500)
|
||||
|
||||
//Meaty Ore
|
||||
/obj/effect/meteor/meaty
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#define RADIATION_DURATION_MAX 30
|
||||
#define RADIATION_ACCURACY_MULTIPLIER 3 //larger is less accurate
|
||||
|
||||
#define RADIATION_IRRADIATION_MULTIPLIER 0.2 //multiplier for how much radiation a test subject recieves
|
||||
#define RADIATION_IRRADIATION_MULTIPLIER 10 //multiplier for how much radiation a test subject recieves
|
||||
|
||||
#define SCANNER_ACTION_SE 1
|
||||
#define SCANNER_ACTION_UI 2
|
||||
@@ -91,7 +91,7 @@
|
||||
occupant_status += "<span class='bad'>DEAD</span>"
|
||||
occupant_status += "</div></div>"
|
||||
occupant_status += "<div class='line'><div class='statusLabel'>Health:</div><div class='progressBar'><div style='width: [viable_occupant.health]%;' class='progressFill good'></div></div><div class='statusValue'>[viable_occupant.health] %</div></div>"
|
||||
occupant_status += "<div class='line'><div class='statusLabel'>Radiation Level:</div><div class='progressBar'><div style='width: [viable_occupant.radiation]%;' class='progressFill bad'></div></div><div class='statusValue'>[viable_occupant.radiation] %</div></div>"
|
||||
occupant_status += "<div class='line'><div class='statusLabel'>Radiation Level:</div><div class='progressBar'><div style='width: [viable_occupant.radiation/(RAD_MOB_SAFE/100)]%;' class='progressFill bad'></div></div><div class='statusValue'>[viable_occupant.radiation/(RAD_MOB_SAFE/100)] %</div></div>"
|
||||
var/rejuvenators = viable_occupant.reagents.get_reagent_amount("potass_iodide")
|
||||
occupant_status += "<div class='line'><div class='statusLabel'>Rejuvenators:</div><div class='progressBar'><div style='width: [round((rejuvenators / REJUVENATORS_MAX) * 100)]%;' class='progressFill highlight'></div></div><div class='statusValue'>[rejuvenators] units</div></div>"
|
||||
occupant_status += "<div class='line'><div class='statusLabel'>Unique Enzymes :</div><div class='statusValue'><span class='highlight'>[viable_occupant.dna.unique_enzymes]</span></div></div>"
|
||||
@@ -536,7 +536,7 @@
|
||||
var/list/buffer_slot = buffer[buffer_num]
|
||||
var/mob/living/carbon/viable_occupant = get_viable_occupant()
|
||||
if(istype(buffer_slot))
|
||||
viable_occupant.radiation += rand(10/(connected.damage_coeff ** 2),25/(connected.damage_coeff ** 2))
|
||||
viable_occupant.radiation += rand(100/(connected.damage_coeff ** 2),250/(connected.damage_coeff ** 2))
|
||||
//15 and 40 are just magic numbers that were here before so i didnt touch them, they are initial boundaries of damage
|
||||
//Each laser level reduces damage by lvl^2, so no effect on 1 lvl, 4 times less damage on 2 and 9 times less damage on 3
|
||||
//Numbers are this high because other way upgrading laser is just not worth the hassle, and i cant think of anything better to inmrove
|
||||
|
||||
@@ -141,9 +141,12 @@
|
||||
diag_hud.add_to_hud(src)
|
||||
diag_hud_set_electrified()
|
||||
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/door/airlock/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_MEDIUM_INSULATION)
|
||||
|
||||
/obj/machinery/door/airlock/proc/update_other_id()
|
||||
for(var/obj/machinery/door/airlock/A in GLOB.airlocks)
|
||||
if(A.closeOtherId == closeOtherId && A != src)
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
..()
|
||||
|
||||
/obj/machinery/door/airlock/uranium/proc/radiate()
|
||||
radiation_pulse(get_turf(src), 3, 3, 15, 0)
|
||||
radiation_pulse(get_turf(src), 150)
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/plasma
|
||||
|
||||
@@ -474,7 +474,7 @@
|
||||
fuel_per_cycle_idle = 10
|
||||
fuel_per_cycle_active = 30
|
||||
power_per_cycle = 50
|
||||
var/rad_per_cycle = 0.3
|
||||
var/rad_per_cycle = 3
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/generator_init()
|
||||
fuel = new /obj/item/stack/sheet/mineral/uranium(src)
|
||||
@@ -485,4 +485,4 @@
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/generator/nuclear/process()
|
||||
if(..())
|
||||
radiation_pulse(get_turf(src), 2, 7, rad_per_cycle, 1)
|
||||
radiation_pulse(get_turf(src), rad_per_cycle)
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
#define RAD_LEVEL_NORMAL 10
|
||||
#define RAD_LEVEL_MODERATE 30
|
||||
#define RAD_LEVEL_HIGH 75
|
||||
#define RAD_LEVEL_VERY_HIGH 125
|
||||
#define RAD_LEVEL_CRITICAL 200
|
||||
#define RAD_LEVEL_NORMAL 9
|
||||
#define RAD_LEVEL_MODERATE 100
|
||||
#define RAD_LEVEL_HIGH 400
|
||||
#define RAD_LEVEL_VERY_HIGH 800
|
||||
#define RAD_LEVEL_CRITICAL 1500
|
||||
|
||||
#define RAD_MEASURE_SMOOTHING 5
|
||||
|
||||
#define RAD_GRACE_PERIOD 2
|
||||
|
||||
/obj/item/device/geiger_counter //DISCLAIMER: I know nothing about how real-life Geiger counters work. This will not be realistic. ~Xhuis
|
||||
name = "geiger counter"
|
||||
@@ -14,25 +18,56 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
slot_flags = SLOT_BELT
|
||||
materials = list(MAT_METAL = 150, MAT_GLASS = 150)
|
||||
var/scanning = 0
|
||||
var/radiation_count = 0
|
||||
|
||||
/obj/item/device/geiger_counter/New()
|
||||
..()
|
||||
var/muted = TRUE
|
||||
var/danger = 0
|
||||
var/grace = RAD_GRACE_PERIOD
|
||||
var/static/list/sounds = list( //hah, static. get it?
|
||||
list('sound/items/geiger/low1.ogg'=1, 'sound/items/geiger/low2.ogg'=1, 'sound/items/geiger/low3.ogg'=1, 'sound/items/geiger/low4.ogg'=1),
|
||||
list('sound/items/geiger/med1.ogg'=1, 'sound/items/geiger/med2.ogg'=1, 'sound/items/geiger/med3.ogg'=1, 'sound/items/geiger/med4.ogg'=1),
|
||||
list('sound/items/geiger/high1.ogg'=1, 'sound/items/geiger/high2.ogg'=1, 'sound/items/geiger/high3.ogg'=1, 'sound/items/geiger/high4.ogg'=1),
|
||||
list('sound/items/geiger/ext1.ogg'=1, 'sound/items/geiger/ext2.ogg'=1, 'sound/items/geiger/ext3.ogg'=1, 'sound/items/geiger/ext4.ogg'=1)
|
||||
)
|
||||
|
||||
var/scanning = FALSE
|
||||
var/radiation_count = 0
|
||||
var/current_tick_amount = 0
|
||||
var/last_tick_amount = 0
|
||||
var/fail_to_receive = 0
|
||||
var/current_warning = 1
|
||||
|
||||
/obj/item/device/geiger_counter/Initialize()
|
||||
. = ..()
|
||||
START_PROCESSING(SSobj, src)
|
||||
|
||||
soundLoop()
|
||||
|
||||
/obj/item/device/geiger_counter/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/obj/item/device/geiger_counter/process()
|
||||
if(emagged)
|
||||
if(radiation_count < 20)
|
||||
radiation_count++
|
||||
return 0
|
||||
if(radiation_count > 0)
|
||||
radiation_count--
|
||||
update_icon()
|
||||
update_icon()
|
||||
|
||||
if(!scanning)
|
||||
current_tick_amount = 0
|
||||
return
|
||||
|
||||
radiation_count -= radiation_count/RAD_MEASURE_SMOOTHING
|
||||
radiation_count += current_tick_amount/RAD_MEASURE_SMOOTHING
|
||||
|
||||
if(current_tick_amount)
|
||||
grace = RAD_GRACE_PERIOD
|
||||
last_tick_amount = current_tick_amount
|
||||
|
||||
else if(!emagged)
|
||||
grace--
|
||||
if(grace <= 0)
|
||||
radiation_count = 0
|
||||
|
||||
update_sound()
|
||||
|
||||
current_tick_amount = 0
|
||||
|
||||
/obj/item/device/geiger_counter/examine(mob/user)
|
||||
..()
|
||||
@@ -56,6 +91,8 @@
|
||||
if(RAD_LEVEL_CRITICAL + 1 to INFINITY)
|
||||
to_chat(user, "<span class='boldannounce'>Ambient radiation levels above critical level!</span>")
|
||||
|
||||
to_chat(user, "<span class='notice'>The last radiation amount detected was [last_tick_amount]</span>")
|
||||
|
||||
/obj/item/device/geiger_counter/update_icon()
|
||||
if(!scanning)
|
||||
icon_state = "geiger_off"
|
||||
@@ -78,24 +115,43 @@
|
||||
icon_state = "geiger_on_5"
|
||||
..()
|
||||
|
||||
/obj/item/device/geiger_counter/rad_act(amount)
|
||||
if(!amount && scanning)
|
||||
return 0
|
||||
if(emagged)
|
||||
amount = Clamp(amount, 0, 25) //Emagged geiger counters can only accept 25 radiation at a time
|
||||
radiation_count += amount
|
||||
if(isliving(loc))
|
||||
var/mob/living/M = loc
|
||||
if(!emagged)
|
||||
to_chat(M, "<span class='boldannounce'>[icon2html(src, M)] RADIATION PULSE DETECTED.</span>")
|
||||
to_chat(M, "<span class='boldannounce'>[icon2html(src, M)] Severity: [amount]</span>")
|
||||
/obj/item/device/geiger_counter/proc/update_sound()
|
||||
switch(radiation_count)
|
||||
if(RAD_BACKGROUND_RADIATION to RAD_LEVEL_MODERATE)
|
||||
danger = 1
|
||||
if(RAD_LEVEL_MODERATE to RAD_LEVEL_VERY_HIGH)
|
||||
danger = 2
|
||||
if(RAD_LEVEL_VERY_HIGH to RAD_LEVEL_CRITICAL)
|
||||
danger = 3
|
||||
if(RAD_LEVEL_CRITICAL to INFINITY)
|
||||
danger = 4
|
||||
else
|
||||
to_chat(M, "<span class='boldannounce'>[icon2html(src, M)] !@%$AT!(N P!LS! D/TEC?ED.</span>")
|
||||
to_chat(M, "<span class='boldannounce'>[icon2html(src, M)] &!F2rity: <=[amount]#1</span>")
|
||||
danger = 0
|
||||
if(!danger)
|
||||
muted = TRUE
|
||||
else if(muted)
|
||||
muted = FALSE
|
||||
soundLoop()
|
||||
|
||||
/obj/item/device/geiger_counter/proc/soundLoop()
|
||||
if(muted || !danger)
|
||||
return
|
||||
playsound(src, pickweight(sounds[danger]), 25)
|
||||
addtimer(CALLBACK(src, .proc/soundLoop), 2)
|
||||
|
||||
/obj/item/device/geiger_counter/rad_act(amount)
|
||||
if(amount <= RAD_BACKGROUND_RADIATION || !scanning)
|
||||
return
|
||||
current_tick_amount += amount
|
||||
update_icon()
|
||||
|
||||
/obj/item/device/geiger_counter/attack_self(mob/user)
|
||||
scanning = !scanning
|
||||
if(!scanning)
|
||||
muted = TRUE
|
||||
else
|
||||
muted = FALSE
|
||||
soundLoop()
|
||||
update_icon()
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] You switch [scanning ? "on" : "off"] [src].</span>")
|
||||
|
||||
@@ -103,12 +159,7 @@
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
if(!emagged)
|
||||
user.visible_message("<span class='notice'>[user] scans [M] with [src].</span>", "<span class='notice'>You scan [M]'s radiation levels with [src]...</span>")
|
||||
if(!M.radiation)
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] Radiation levels within normal boundaries.</span>")
|
||||
return 1
|
||||
else
|
||||
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation].</span>")
|
||||
return 1
|
||||
addtimer(CALLBACK(src, .proc/scan, M, user), 20, TIMER_UNIQUE) // Let's not have spamming GetAllContents
|
||||
else
|
||||
user.visible_message("<span class='notice'>[user] scans [M] with [src].</span>", "<span class='danger'>You project [src]'s stored radiation into [M]'s body!</span>")
|
||||
M.rad_act(radiation_count)
|
||||
@@ -116,6 +167,28 @@
|
||||
return 1
|
||||
..()
|
||||
|
||||
/obj/item/device/geiger_counter/proc/scan(atom/A, mob/user)
|
||||
var/rad_strength = 0
|
||||
for(var/i in get_rad_contents(A)) // Yes it's intentional that you can't detect radioactive things under rad protection. Gives traitors a way to hide their glowing green rocks.
|
||||
var/atom/thing = i
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/component/radioactive/radiation = thing.GetComponent(/datum/component/radioactive)
|
||||
if(radiation)
|
||||
rad_strength += radiation.strength
|
||||
|
||||
if(isliving(A))
|
||||
var/mob/living/M = A
|
||||
if(!M.radiation)
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] Radiation levels within normal boundaries.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Subject is irradiated. Radiation levels: [M.radiation].</span>")
|
||||
|
||||
if(rad_strength)
|
||||
to_chat(user, "<span class='boldannounce'>[icon2html(src, user)] Subject has irradiated objects on them. Radioactive strength: [rad_strength]</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[icon2html(src, user)] Subject is free of radioactive contamination.</span>")
|
||||
|
||||
/obj/item/device/geiger_counter/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/screwdriver) && emagged)
|
||||
if(scanning)
|
||||
|
||||
@@ -1,53 +1,53 @@
|
||||
/obj/item/grenade/syndieminibomb
|
||||
desc = "A syndicate manufactured explosive used to sow destruction and chaos"
|
||||
name = "syndicate minibomb"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "syndicate"
|
||||
item_state = "flashbang"
|
||||
origin_tech = "materials=3;magnets=4;syndicate=3"
|
||||
|
||||
|
||||
/obj/item/grenade/syndieminibomb/prime()
|
||||
update_mob()
|
||||
explosion(src.loc,1,2,4,flame_range = 2)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/syndieminibomb/concussion
|
||||
name = "HE Grenade"
|
||||
desc = "A compact shrapnel grenade meant to devestate nearby organisms and cause some damage in the process. Pull pin and throw opposite direction."
|
||||
icon_state = "concussion"
|
||||
origin_tech = "materials=3;magnets=4;syndicate=2"
|
||||
|
||||
/obj/item/grenade/syndieminibomb/concussion/prime()
|
||||
update_mob()
|
||||
explosion(src.loc,0,2,3,flame_range = 3)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/syndieminibomb/concussion/frag
|
||||
name = "frag grenade"
|
||||
desc = "Fire in the hole."
|
||||
icon_state = "frag"
|
||||
|
||||
/obj/item/grenade/gluon
|
||||
desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also likely wet any nearby floors."
|
||||
name = "gluon frag grenade"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "bluefrag"
|
||||
item_state = "flashbang"
|
||||
var/freeze_range = 4
|
||||
var/rad_damage = 35
|
||||
var/stamina_damage = 30
|
||||
|
||||
/obj/item/grenade/gluon/prime()
|
||||
update_mob()
|
||||
playsound(loc, 'sound/effects/empulse.ogg', 50, 1)
|
||||
radiation_pulse(loc,freeze_range,freeze_range+1,rad_damage)
|
||||
for(var/turf/T in view(freeze_range,loc))
|
||||
if(isfloorturf(T))
|
||||
var/turf/open/floor/F = T
|
||||
F.wet = TURF_WET_PERMAFROST
|
||||
addtimer(CALLBACK(F, /turf/open/floor.proc/MakeDry, TURF_WET_PERMAFROST), rand(3000, 3100))
|
||||
for(var/mob/living/carbon/L in T)
|
||||
L.adjustStaminaLoss(stamina_damage)
|
||||
L.bodytemperature -= 230
|
||||
qdel(src)
|
||||
/obj/item/grenade/syndieminibomb
|
||||
desc = "A syndicate manufactured explosive used to sow destruction and chaos."
|
||||
name = "syndicate minibomb"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "syndicate"
|
||||
item_state = "flashbang"
|
||||
origin_tech = "materials=3;magnets=4;syndicate=3"
|
||||
|
||||
|
||||
/obj/item/grenade/syndieminibomb/prime()
|
||||
update_mob()
|
||||
explosion(src.loc,1,2,4,flame_range = 2)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/syndieminibomb/concussion
|
||||
name = "HE Grenade"
|
||||
desc = "A compact shrapnel grenade meant to devestate nearby organisms and cause some damage in the process. Pull pin and throw opposite direction."
|
||||
icon_state = "concussion"
|
||||
origin_tech = "materials=3;magnets=4;syndicate=2"
|
||||
|
||||
/obj/item/grenade/syndieminibomb/concussion/prime()
|
||||
update_mob()
|
||||
explosion(src.loc,0,2,3,flame_range = 3)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/grenade/syndieminibomb/concussion/frag
|
||||
name = "frag grenade"
|
||||
desc = "Fire in the hole."
|
||||
icon_state = "frag"
|
||||
|
||||
/obj/item/grenade/gluon
|
||||
desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also likely wet any nearby floors."
|
||||
name = "gluon frag grenade"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "bluefrag"
|
||||
item_state = "flashbang"
|
||||
var/freeze_range = 4
|
||||
var/rad_damage = 350
|
||||
var/stamina_damage = 30
|
||||
|
||||
/obj/item/grenade/gluon/prime()
|
||||
update_mob()
|
||||
playsound(loc, 'sound/effects/empulse.ogg', 50, 1)
|
||||
radiation_pulse(get_turf(src), rad_damage)
|
||||
for(var/turf/T in view(freeze_range,loc))
|
||||
if(isfloorturf(T))
|
||||
var/turf/open/floor/F = T
|
||||
F.wet = TURF_WET_PERMAFROST
|
||||
addtimer(CALLBACK(F, /turf/open/floor.proc/MakeDry, TURF_WET_PERMAFROST), rand(3000, 3100))
|
||||
for(var/mob/living/carbon/L in T)
|
||||
L.adjustStaminaLoss(stamina_damage)
|
||||
L.bodytemperature -= 230
|
||||
qdel(src)
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
if(cooldown < world.time - 60)
|
||||
cooldown = world.time
|
||||
flick(pulseicon, src)
|
||||
radiation_pulse(get_turf(src), 1, 4, 40, 1)
|
||||
radiation_pulse(get_turf(src), 400, 2)
|
||||
|
||||
//nuke core box, for carrying the core
|
||||
/obj/item/nuke_core_container
|
||||
@@ -140,7 +140,7 @@
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>As it touches \the [src], both \the [src] and \the [W] burst into dust!</span>")
|
||||
radiation_pulse(get_turf(user), 1, 2, 10, 1)
|
||||
radiation_pulse(get_turf(user), 100)
|
||||
playsound(src, 'sound/effects/supermatter.ogg', 50, 1)
|
||||
qdel(W)
|
||||
qdel(src)
|
||||
@@ -151,7 +151,7 @@
|
||||
return FALSE
|
||||
var/mob/ded = user
|
||||
to_chat(user, "<span class='warning'>You reach for the supermatter sliver with your hands. That was dumb.</span>")
|
||||
radiation_pulse(get_turf(user), 2, 4, 50, 1)
|
||||
radiation_pulse(get_turf(user), 500, 2)
|
||||
playsound(get_turf(user), 'sound/effects/supermatter.ogg', 50, 1)
|
||||
ded.dust()
|
||||
|
||||
@@ -240,7 +240,7 @@
|
||||
user.visible_message("<span class='danger'>As [user] touches \the [AM] with \a [src], silence fills the room...</span>",\
|
||||
"<span class='userdanger'>You touch \the [AM] with \the [src], and everything suddenly goes silent.</span>\n<span class='notice'>\The [AM] flashes into dust, and soon as you can register this, you do as well.</span>",\
|
||||
"<span class='italics'>Everything suddenly goes silent.</span>")
|
||||
radiation_pulse(get_turf(user), 2, 4, 50, 1)
|
||||
radiation_pulse(get_turf(user), 500, 2)
|
||||
playsound(src, 'sound/effects/supermatter.ogg', 50, 1)
|
||||
user.dust()
|
||||
icon_state = "supermatter_tongs"
|
||||
|
||||
@@ -29,9 +29,13 @@
|
||||
can_be_unanchored = FALSE
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
|
||||
/obj/structure/falsewall/New(loc)
|
||||
..()
|
||||
air_update_turf(1)
|
||||
/obj/structure/falsewall/Initialize()
|
||||
. = ..()
|
||||
air_update_turf(TRUE)
|
||||
|
||||
/obj/structure/falsewall/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_MEDIUM_INSULATION)
|
||||
|
||||
/obj/structure/falsewall/Destroy()
|
||||
density = FALSE
|
||||
@@ -195,7 +199,7 @@
|
||||
if(!active)
|
||||
if(world.time > last_event+15)
|
||||
active = 1
|
||||
radiation_pulse(get_turf(src), 0, 3, 15, 1)
|
||||
radiation_pulse(get_turf(src), 150)
|
||||
for(var/turf/closed/wall/mineral/uranium/T in orange(1,src))
|
||||
T.radiate()
|
||||
last_event = world.time
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
var/can_displace = TRUE //If the girder can be moved around by wrenching it
|
||||
max_integrity = 200
|
||||
|
||||
/obj/structure/girder/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_VERY_LIGHT_INSULATION)
|
||||
|
||||
/obj/structure/girder/examine(mob/user)
|
||||
. = ..()
|
||||
switch(state)
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
var/grille_type = null
|
||||
var/broken_type = /obj/structure/grille/broken
|
||||
|
||||
/obj/structure/grille/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
|
||||
|
||||
/obj/structure/grille/examine(mob/user)
|
||||
..()
|
||||
if(anchored)
|
||||
|
||||
@@ -61,6 +61,10 @@
|
||||
/obj/structure/holosign/barrier/engineering
|
||||
icon_state = "holosign_engi"
|
||||
|
||||
/obj/structure/holosign/barrier/engineering/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_LIGHT_INSULATION)
|
||||
|
||||
/obj/structure/holosign/barrier/atmos
|
||||
name = "holo firelock"
|
||||
desc = "A holographic barrier resembling a firelock. Though it does not prevent solid objects from passing through, gas is kept out."
|
||||
|
||||
@@ -22,10 +22,13 @@
|
||||
var/closeSound = 'sound/effects/stonedoor_openclose.ogg'
|
||||
CanAtmosPass = ATMOS_PASS_DENSITY
|
||||
|
||||
/obj/structure/mineral_door/New(location)
|
||||
..()
|
||||
/obj/structure/mineral_door/Initialize()
|
||||
. = ..()
|
||||
initial_state = icon_state
|
||||
air_update_turf(1)
|
||||
air_update_turf(TRUE)
|
||||
|
||||
/obj/structure/mineral_door/ComponentInitialize()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_MEDIUM_INSULATION)
|
||||
|
||||
/obj/structure/mineral_door/Destroy()
|
||||
density = FALSE
|
||||
@@ -151,11 +154,17 @@
|
||||
sheetType = /obj/item/stack/sheet/mineral/silver
|
||||
max_integrity = 300
|
||||
|
||||
/obj/structure/mineral_door/silver/ComponentInitialize()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_HEAVY_INSULATION)
|
||||
|
||||
/obj/structure/mineral_door/gold
|
||||
name = "gold door"
|
||||
icon_state = "gold"
|
||||
sheetType = /obj/item/stack/sheet/mineral/gold
|
||||
|
||||
/obj/structure/mineral_door/gold/ComponentInitialize()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_HEAVY_INSULATION)
|
||||
|
||||
/obj/structure/mineral_door/uranium
|
||||
name = "uranium door"
|
||||
icon_state = "uranium"
|
||||
@@ -163,6 +172,9 @@
|
||||
max_integrity = 300
|
||||
light_range = 2
|
||||
|
||||
/obj/structure/mineral_door/uranium/ComponentInitialize()
|
||||
return
|
||||
|
||||
/obj/structure/mineral_door/sandstone
|
||||
name = "sandstone door"
|
||||
icon_state = "sandstone"
|
||||
@@ -172,6 +184,9 @@
|
||||
/obj/structure/mineral_door/transparent
|
||||
opacity = FALSE
|
||||
|
||||
/obj/structure/mineral_door/transparent/ComponentInitialize()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_VERY_LIGHT_INSULATION)
|
||||
|
||||
/obj/structure/mineral_door/transparent/Close()
|
||||
..()
|
||||
set_opacity(FALSE)
|
||||
@@ -181,6 +196,9 @@
|
||||
icon_state = "plasma"
|
||||
sheetType = /obj/item/stack/sheet/mineral/plasma
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma/ComponentInitialize()
|
||||
return
|
||||
|
||||
/obj/structure/mineral_door/transparent/plasma/attackby(obj/item/W, mob/user, params)
|
||||
if(W.is_hot())
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -204,6 +222,9 @@
|
||||
sheetType = /obj/item/stack/sheet/mineral/diamond
|
||||
max_integrity = 1000
|
||||
|
||||
/obj/structure/mineral_door/transparent/diamond/ComponentInitialize()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_EXTREME_INSULATION)
|
||||
|
||||
/obj/structure/mineral_door/wood
|
||||
name = "wood door"
|
||||
icon_state = "wood"
|
||||
@@ -213,6 +234,9 @@
|
||||
resistance_flags = FLAMMABLE
|
||||
max_integrity = 200
|
||||
|
||||
/obj/structure/mineral_door/wood/ComponentInitialize()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_VERY_LIGHT_INSULATION)
|
||||
|
||||
/obj/structure/mineral_door/paperframe
|
||||
name = "paper frame door"
|
||||
icon_state = "paperframe"
|
||||
@@ -227,6 +251,9 @@
|
||||
. = ..()
|
||||
queue_smooth_neighbors(src)
|
||||
|
||||
/obj/structure/mineral_door/paperframe/ComponentInitialize()
|
||||
return
|
||||
|
||||
/obj/structure/mineral_door/paperframe/Destroy()
|
||||
queue_smooth_neighbors(src)
|
||||
return ..()
|
||||
|
||||
@@ -8,6 +8,10 @@
|
||||
armor = list(melee = 50, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 50)
|
||||
var/buildable_sign = 1 //unwrenchable and modifiable
|
||||
|
||||
/obj/structure/sign/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION) // Since this is on a wall if it becomes irradiated it will smuggle the radiation past the wall
|
||||
|
||||
/obj/structure/sign/basic
|
||||
name = "blank sign"
|
||||
desc = "How can signs be real if our eyes aren't real?"
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
if(!active)
|
||||
if(world.time > last_event+15)
|
||||
active = 1
|
||||
radiation_pulse(get_turf(src), 3, 3, 12, 0)
|
||||
radiation_pulse(get_turf(src), 30)
|
||||
last_event = world.time
|
||||
active = null
|
||||
return
|
||||
|
||||
@@ -78,6 +78,10 @@
|
||||
real_explosion_block = explosion_block
|
||||
explosion_block = EXPLOSION_BLOCK_PROC
|
||||
|
||||
/obj/structure/window/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_VERY_LIGHT_INSULATION, TRUE, FALSE)
|
||||
|
||||
/obj/structure/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
switch(the_rcd.mode)
|
||||
if(RCD_DECONSTRUCT)
|
||||
@@ -432,6 +436,9 @@
|
||||
explosion_block = 1
|
||||
glass_type = /obj/item/stack/sheet/rglass
|
||||
|
||||
/obj/structure/window/reinforced/ComponentInitialize()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_HEAVY_INSULATION, TRUE, FALSE)
|
||||
|
||||
/obj/structure/window/reinforced/spawner/east
|
||||
dir = EAST
|
||||
|
||||
@@ -455,6 +462,9 @@
|
||||
explosion_block = 1
|
||||
glass_type = /obj/item/stack/sheet/plasmaglass
|
||||
|
||||
/obj/structure/window/plasma/ComponentInitialize()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE)
|
||||
|
||||
/obj/structure/window/plasma/spawner/east
|
||||
dir = EAST
|
||||
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
density = TRUE
|
||||
blocks_air = 1
|
||||
|
||||
/turf/closed/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_MEDIUM_INSULATION)
|
||||
|
||||
/turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir)
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
if(!active)
|
||||
if(world.time > last_event+15)
|
||||
active = 1
|
||||
radiation_pulse(get_turf(src), 3, 3, 1, 0)
|
||||
radiation_pulse(get_turf(src), 10)
|
||||
for(var/turf/open/floor/mineral/uranium/T in orange(1,src))
|
||||
T.radiate()
|
||||
last_event = world.time
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
if(!active)
|
||||
if(world.time > last_event+15)
|
||||
active = 1
|
||||
radiation_pulse(get_turf(src), 3, 3, 4, 0)
|
||||
radiation_pulse(get_turf(src), 40)
|
||||
for(var/turf/closed/wall/mineral/uranium/T in orange(1,src))
|
||||
T.radiate()
|
||||
last_event = world.time
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
girder_type = /obj/structure/girder/reinforced
|
||||
explosion_block = 2
|
||||
|
||||
/turf/closed/wall/r_wall/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_HEAVY_INSULATION)
|
||||
|
||||
/turf/closed/wall/r_wall/deconstruction_hints(mob/user)
|
||||
switch(d_state)
|
||||
if(INTACT)
|
||||
|
||||
@@ -44,6 +44,8 @@
|
||||
if (opacity)
|
||||
has_opaque_atom = TRUE
|
||||
|
||||
ComponentInitialize()
|
||||
|
||||
return INITIALIZE_HINT_NORMAL
|
||||
|
||||
/turf/open/space/attack_ghost(mob/dead/observer/user)
|
||||
|
||||
@@ -56,6 +56,9 @@
|
||||
|
||||
if (opacity)
|
||||
has_opaque_atom = TRUE
|
||||
|
||||
ComponentInitialize()
|
||||
|
||||
return INITIALIZE_HINT_NORMAL
|
||||
|
||||
/turf/proc/Initalize_Atmos(times_fired)
|
||||
|
||||
Reference in New Issue
Block a user