Merge pull request #3364 from Citadel-Station-13/upstream-merge-30909
[MIRROR] Radiation rework and subsystem
This commit is contained in:
@@ -28,10 +28,12 @@
|
||||
#define COMSIG_ATOM_BLOB_ACT "atom_blob_act" //from base of atom/blob_act(): (/obj/structure/blob)
|
||||
#define COMSIG_ATOM_ACID_ACT "atom_acid_act" //from base of atom/acid_act(): (acidpwr, acid_volume)
|
||||
#define COMSIG_ATOM_EMAG_ACT "atom_emag_act" //from base of atom/emag_act(): ()
|
||||
#define COMSIG_ATOM_RAD_ACT "atom_rad_act" //from base of atom/rad_act(intensity)
|
||||
#define COMSIG_ATOM_NARSIE_ACT "atom_narsie_act" //from base of atom/narsie_act(): ()
|
||||
#define COMSIG_ATOM_RATVAR_ACT "atom_ratvar_act" //from base of atom/ratvar_act(): ()
|
||||
#define COMSIG_ATOM_RCD_ACT "atom_rcd_act" //from base of atom/rcd_act(): (/mob, /obj/item/construction/rcd, passed_mode)
|
||||
#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size)
|
||||
#define COMSIG_ATOM_SET_LIGHT "atom_set_light" //from base of atom/set_light(): (l_range, l_power, l_color)
|
||||
|
||||
#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params)
|
||||
#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob)
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
These defines are the balancing points of various parts of the radiation system.
|
||||
Changes here can have widespread effects: make sure you test well.
|
||||
Ask ninjanomnom if they're around
|
||||
*/
|
||||
|
||||
#define RAD_BACKGROUND_RADIATION 9 // How much radiation is harmless to a mob, this is also when radiation waves stop spreading
|
||||
// WARNING: Lowering this value significantly increases SSradiation load
|
||||
#define RAD_AMOUNT_LOW 50
|
||||
#define RAD_AMOUNT_MEDIUM 200
|
||||
#define RAD_AMOUNT_HIGH 500
|
||||
#define RAD_AMOUNT_EXTREME 1000
|
||||
|
||||
// apply_effect(amount * RAD_MOB_COEFFICIENT, IRRADIATE, blocked)
|
||||
#define RAD_MOB_COEFFICIENT 0.25 // Radiation applied is multiplied by this
|
||||
|
||||
#define RAD_LOSS_PER_TICK 1
|
||||
#define RAD_TOX_COEFFICIENT 0.1 // Toxin damage per tick coefficient
|
||||
|
||||
#define RAD_MOB_SAFE 300 // How much stored radiation in a mob with no ill effects
|
||||
#define RAD_MOB_KNOCKDOWN 1500 // How much stored radiation to start stunning
|
||||
// If (mutate*2<knockdown) then monkeys will sometimes turn into gorillas before being knocked down
|
||||
// otherwise they only turn into gorillas *after* being knocked down
|
||||
#define RAD_MOB_MUTATE 800 // How much stored radiation to check for mutation
|
||||
#define RAD_MOB_HAIRLOSS 500 // How much stored radiation to check for hair loss
|
||||
|
||||
#define RAD_KNOCKDOWN_TIME 200 // How much knockdown to apply
|
||||
|
||||
#define RAD_NO_INSULATION 1.0 // For things that shouldn't become irradiated for whatever reason
|
||||
#define RAD_VERY_LIGHT_INSULATION 0.9 // What girders have
|
||||
#define RAD_LIGHT_INSULATION 0.8
|
||||
#define RAD_MEDIUM_INSULATION 0.7 // What common walls have
|
||||
#define RAD_HEAVY_INSULATION 0.6 // What reinforced walls have
|
||||
#define RAD_EXTREME_INSULATION 0.5 // What rad collectors have
|
||||
#define RAD_FULL_INSULATION 0 // Unused
|
||||
|
||||
// WARNING: The deines below could have disastrous consequences if tweaked incorrectly. See: The great SM purge of Oct.6.2017
|
||||
// contamination_chance = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1/(steps*RAD_DISTANCE_COEFFICIENT), 1))
|
||||
// contamination_strength = (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT * min(1/(steps*RAD_DISTANCE_COEFFICIENT), 1)
|
||||
#define RAD_MINIMUM_CONTAMINATION 300 // How strong does a radiation wave have to be to contaminate objects
|
||||
#define RAD_CONTAMINATION_CHANCE_COEFFICIENT 0.0075 // Higher means higher strength scaling contamination chance
|
||||
#define RAD_CONTAMINATION_STR_COEFFICIENT 0.5 // Higher means higher strength scaling contamination strength
|
||||
#define RAD_DISTANCE_COEFFICIENT 1 // Lower means further rad spread
|
||||
|
||||
#define RAD_HALF_LIFE 150 // The half-life of contaminated objects
|
||||
@@ -43,6 +43,8 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4,
|
||||
/proc/Inverse(x)
|
||||
return 1 / x
|
||||
|
||||
#define InverseSquareLaw(initial_strength,cur_distance,initial_distance) (initial_strength*(initial_distance**2/cur_distance**2))
|
||||
|
||||
/proc/IsAboutEqual(a, b, deviation = 0.1)
|
||||
return abs(a - b) <= deviation
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/proc/get_rad_contents(atom/location, list/output=list()) // A special GetAllContents that doesn't search past things with rad insulation
|
||||
. = output
|
||||
|
||||
if(!location)
|
||||
return
|
||||
|
||||
output += location
|
||||
|
||||
var/datum/component/rad_insulation/insulation = location.GetComponent(/datum/component/rad_insulation)
|
||||
if(insulation && insulation.protects)
|
||||
return
|
||||
|
||||
for(var/i in 1 to location.contents.len)
|
||||
var/static/list/ignored_things = typecacheof(list(/mob/dead, /obj/effect, /obj/docking_port, /turf, /atom/movable/lighting_object))
|
||||
var/atom/thing = location.contents[i]
|
||||
if(ignored_things[thing.type])
|
||||
continue
|
||||
get_rad_contents(thing, output)
|
||||
|
||||
/proc/radiation_pulse(turf/epicenter, intensity, range_modifier, log=FALSE, can_contaminate=TRUE)
|
||||
if(!SSradiation.can_fire)
|
||||
return
|
||||
for(var/dir in GLOB.cardinals)
|
||||
new /datum/radiation_wave(epicenter, dir, intensity, range_modifier, can_contaminate)
|
||||
|
||||
var/list/things = get_rad_contents(epicenter) //copypasta because I don't want to put special code in waves to handle their origin
|
||||
for(var/k in 1 to things.len)
|
||||
var/atom/thing = things[k]
|
||||
if(!thing)
|
||||
continue
|
||||
thing.rad_act(intensity)
|
||||
|
||||
if(log)
|
||||
log_game("Radiation pulse with intensity:[intensity] and range modifier:[range_modifier] in area [epicenter.loc.name] ")
|
||||
return TRUE
|
||||
@@ -0,0 +1,4 @@
|
||||
PROCESSING_SUBSYSTEM_DEF(radiation)
|
||||
name = "Radiation"
|
||||
flags = SS_NO_INIT | SS_BACKGROUND
|
||||
priority = 25
|
||||
@@ -0,0 +1,9 @@
|
||||
/datum/component/rad_insulation // Yes, this really is just a component to add some vars
|
||||
var/amount // Multiplier for radiation strength passing through
|
||||
var/protects // Does this protect things in its contents from being affected?
|
||||
var/contamination_proof // Can this object be contaminated?
|
||||
|
||||
/datum/component/rad_insulation/Initialize(_amount=RAD_MEDIUM_INSULATION, _protects=TRUE, _contamination_proof=TRUE)
|
||||
amount = _amount
|
||||
protects = _protects
|
||||
contamination_proof = _contamination_proof
|
||||
@@ -0,0 +1,73 @@
|
||||
#define RAD_AMOUNT_LOW 50
|
||||
#define RAD_AMOUNT_MEDIUM 200
|
||||
#define RAD_AMOUNT_HIGH 500
|
||||
#define RAD_AMOUNT_EXTREME 1000
|
||||
|
||||
/datum/component/radioactive
|
||||
dupe_mode = COMPONENT_DUPE_UNIQUE
|
||||
|
||||
var/hl3_release_date //the half-life measured in ticks
|
||||
var/strength
|
||||
var/can_contaminate
|
||||
|
||||
/datum/component/radioactive/Initialize(_strength=0, _half_life=RAD_HALF_LIFE, _can_contaminate=TRUE)
|
||||
strength = _strength
|
||||
hl3_release_date = _half_life
|
||||
can_contaminate = _can_contaminate
|
||||
|
||||
if(istype(parent, /atom))
|
||||
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/rad_examine)
|
||||
if(istype(parent, /obj/item))
|
||||
RegisterSignal(COMSIG_ITEM_ATTACK, .proc/rad_attack)
|
||||
RegisterSignal(COMSIG_ITEM_ATTACK_OBJ, .proc/rad_attack)
|
||||
else
|
||||
CRASH("Something that wasn't an atom was given /datum/component/radioactive")
|
||||
return
|
||||
|
||||
START_PROCESSING(SSradiation, src)
|
||||
|
||||
/datum/component/radioactive/Destroy()
|
||||
STOP_PROCESSING(SSradiation, src)
|
||||
return ..()
|
||||
|
||||
/datum/component/radioactive/process()
|
||||
radiation_pulse(get_turf(parent),strength,1,FALSE,can_contaminate)
|
||||
|
||||
if(hl3_release_date && prob(50))
|
||||
strength -= strength / hl3_release_date
|
||||
if(strength <= RAD_BACKGROUND_RADIATION)
|
||||
qdel(src)
|
||||
|
||||
/datum/component/radioactive/InheritComponent(datum/component/C, i_am_original)
|
||||
if(!i_am_original)
|
||||
return
|
||||
if(!hl3_release_date) // Permanently radioactive things don't get to grow stronger
|
||||
return
|
||||
var/datum/component/radioactive/other = C
|
||||
strength = max(strength, other.strength)
|
||||
return
|
||||
|
||||
/datum/component/radioactive/proc/rad_examine(mob/user, atom/thing)
|
||||
var/atom/master = parent
|
||||
var/list/out = list()
|
||||
if(get_dist(master, user) <= 1)
|
||||
out += "The air around [master] feels warm"
|
||||
switch(strength)
|
||||
if(RAD_AMOUNT_LOW to RAD_AMOUNT_MEDIUM)
|
||||
out += "[out ? " and it " : "[master] "]feels weird to look at."
|
||||
if(RAD_AMOUNT_MEDIUM to RAD_AMOUNT_HIGH)
|
||||
out += "[out ? " and it " : "[master] "]seems to be glowing a bit."
|
||||
if(RAD_AMOUNT_HIGH to INFINITY) //At this level the object can contaminate other objects
|
||||
out += "[out ? " and it " : "[master] "]hurts to look at."
|
||||
else
|
||||
out += "."
|
||||
to_chat(user, out.Join())
|
||||
|
||||
/datum/component/radioactive/proc/rad_attack(atom/movable/target, mob/living/user)
|
||||
radiation_pulse(get_turf(target), strength/20)
|
||||
target.rad_act(strength/2)
|
||||
|
||||
#undef RAD_AMOUNT_LOW
|
||||
#undef RAD_AMOUNT_MEDIUM
|
||||
#undef RAD_AMOUNT_HIGH
|
||||
#undef RAD_AMOUNT_EXTREME
|
||||
@@ -0,0 +1,98 @@
|
||||
/datum/radiation_wave
|
||||
var/turf/master_turf //The center of the wave
|
||||
var/steps=0 //How far we've moved
|
||||
var/intensity //How strong it was originaly
|
||||
var/range_modifier //Higher than 1 makes it drop off faster, 0.5 makes it drop off half etc
|
||||
var/move_dir //The direction of movement
|
||||
var/list/__dirs //The directions to the side of the wave, stored for easy looping
|
||||
var/can_contaminate
|
||||
|
||||
/datum/radiation_wave/New(turf/place, dir, _intensity=0, _range_modifier=RAD_DISTANCE_COEFFICIENT, _can_contaminate=TRUE)
|
||||
master_turf = place
|
||||
|
||||
move_dir = dir
|
||||
__dirs = list()
|
||||
__dirs+=turn(dir, 90)
|
||||
__dirs+=turn(dir, -90)
|
||||
|
||||
intensity = _intensity
|
||||
range_modifier = _range_modifier
|
||||
can_contaminate = _can_contaminate
|
||||
|
||||
START_PROCESSING(SSradiation, src)
|
||||
|
||||
/datum/radiation_wave/Destroy()
|
||||
STOP_PROCESSING(SSradiation, src)
|
||||
return ..()
|
||||
|
||||
/datum/radiation_wave/process()
|
||||
master_turf = get_step(master_turf, move_dir)
|
||||
steps++
|
||||
var/list/atoms = get_rad_atoms()
|
||||
|
||||
var/strength
|
||||
if(steps>1)
|
||||
strength = InverseSquareLaw(intensity, max(range_modifier*steps, 1), 1)
|
||||
else
|
||||
strength = intensity
|
||||
|
||||
if(strength<RAD_BACKGROUND_RADIATION)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
radiate(atoms, Floor(strength))
|
||||
|
||||
check_obstructions(atoms) // reduce our overall strength if there are radiation insulators
|
||||
|
||||
/datum/radiation_wave/proc/get_rad_atoms()
|
||||
var/list/atoms = list()
|
||||
var/distance = steps
|
||||
var/cmove_dir = move_dir
|
||||
var/cmaster_turf = master_turf
|
||||
|
||||
if(cmove_dir == NORTH || cmove_dir == SOUTH)
|
||||
distance-- //otherwise corners overlap
|
||||
|
||||
atoms += get_rad_contents(cmaster_turf)
|
||||
|
||||
var/turf/place
|
||||
for(var/dir in __dirs) //There should be just 2 dirs in here, left and right of the direction of movement
|
||||
place = cmaster_turf
|
||||
for(var/i in 1 to distance)
|
||||
place = get_step(place, dir)
|
||||
atoms += get_rad_contents(place)
|
||||
|
||||
return atoms
|
||||
|
||||
/datum/radiation_wave/proc/check_obstructions(list/atoms)
|
||||
var/width = steps
|
||||
var/cmove_dir = move_dir
|
||||
if(cmove_dir == NORTH || cmove_dir == SOUTH)
|
||||
width--
|
||||
width = 1+(2*width)
|
||||
|
||||
for(var/k in 1 to atoms.len)
|
||||
var/atom/thing = atoms[k]
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/component/rad_insulation/insulation = thing.GetComponent(/datum/component/rad_insulation)
|
||||
if(!insulation)
|
||||
continue
|
||||
intensity = intensity*(1-((1-insulation.amount)/width)) // The further out the rad wave goes the less it's affected by insulation
|
||||
|
||||
/datum/radiation_wave/proc/radiate(list/atoms, strength)
|
||||
for(var/k in 1 to atoms.len)
|
||||
var/atom/thing = atoms[k]
|
||||
if(!thing)
|
||||
continue
|
||||
thing.rad_act(strength)
|
||||
|
||||
var/static/list/blacklisted = typecacheof(list(/turf))
|
||||
if(!can_contaminate || blacklisted[thing.type])
|
||||
continue
|
||||
if(prob((strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_CHANCE_COEFFICIENT * min(1/(steps*range_modifier), 1))) // Only stronk rads get to have little baby rads
|
||||
var/datum/component/rad_insulation/insulation = thing.GetComponent(/datum/component/rad_insulation)
|
||||
if(insulation && insulation.contamination_proof)
|
||||
continue
|
||||
else
|
||||
thing.AddComponent(/datum/component/radioactive, (strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT * min(1/(steps*range_modifier), 1))
|
||||
@@ -43,7 +43,7 @@
|
||||
else
|
||||
H.randmutg()
|
||||
H.domutcheck()
|
||||
L.rad_act(20,1)
|
||||
L.rad_act(20)
|
||||
|
||||
/datum/weather/rad_storm/end()
|
||||
if(..())
|
||||
|
||||
+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)
|
||||
|
||||
@@ -48,6 +48,10 @@ Pipelines + Other Objects -> Pipe network
|
||||
SSair.atmos_machinery += src
|
||||
SetInitDirections()
|
||||
|
||||
/obj/machinery/atmospherics/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION) //This would be a bad idea
|
||||
|
||||
/obj/machinery/atmospherics/Destroy()
|
||||
for(DEVICE_TYPE_LOOP)
|
||||
nullifyNode(I)
|
||||
|
||||
@@ -51,7 +51,8 @@
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity)
|
||||
..()
|
||||
display_visor_message("Radiation pulse detected! Magnitude: <span class='green'>[severity]</span> RADs.")
|
||||
if(severity > RAD_AMOUNT_EXTREME)
|
||||
display_visor_message("Radiation pulse detected! Magnitude: <span class='green'>[severity]</span> RADs.")
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/emp_act(severity)
|
||||
..()
|
||||
|
||||
@@ -116,6 +116,10 @@
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
resistance_flags = 0
|
||||
|
||||
/obj/item/clothing/head/radiation/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE)
|
||||
|
||||
/obj/item/clothing/suit/radiation
|
||||
name = "radiation suit"
|
||||
desc = "A suit that protects against radiation. The label reads, 'Made with lead. Please do not consume insulation.'"
|
||||
@@ -133,3 +137,9 @@
|
||||
equip_delay_other = 60
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
resistance_flags = 0
|
||||
|
||||
/obj/item/clothing/suit/radiation/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION, TRUE, FALSE)
|
||||
// Just don't want things to be irradiated inside this
|
||||
// Except things on the mob aren't even inside the suit so ehhhhhh
|
||||
@@ -23,6 +23,8 @@
|
||||
if (l_color != NONSENSICAL_VALUE)
|
||||
light_color = l_color
|
||||
|
||||
SendSignal(COMSIG_ATOM_SET_LIGHT, l_range, l_power, l_color)
|
||||
|
||||
update_light()
|
||||
|
||||
#undef NONSENSICAL_VALUE
|
||||
|
||||
@@ -24,6 +24,9 @@
|
||||
loc = pick(GLOB.newplayer_start)
|
||||
else
|
||||
loc = locate(1,1,1)
|
||||
|
||||
ComponentInitialize()
|
||||
|
||||
. = ..()
|
||||
|
||||
/mob/dead/new_player/prepare_huds()
|
||||
|
||||
@@ -1135,36 +1135,31 @@
|
||||
return 0
|
||||
|
||||
/datum/species/proc/handle_mutations_and_radiation(mob/living/carbon/human/H)
|
||||
. = FALSE
|
||||
var/radiation = H.radiation
|
||||
|
||||
if(!(RADIMMUNE in species_traits))
|
||||
if(H.radiation)
|
||||
if (H.radiation > 100)
|
||||
if(!H.IsKnockdown())
|
||||
H.emote("collapse")
|
||||
H.Knockdown(200)
|
||||
to_chat(H, "<span class='danger'>You feel weak.</span>")
|
||||
switch(H.radiation)
|
||||
if(50 to 75)
|
||||
if(prob(5))
|
||||
if(!H.IsKnockdown())
|
||||
H.emote("collapse")
|
||||
H.Knockdown(60)
|
||||
to_chat(H, "<span class='danger'>You feel weak.</span>")
|
||||
if(RADIMMUNE in species_traits)
|
||||
radiation = 0
|
||||
return TRUE
|
||||
|
||||
if(prob(15))
|
||||
if(!( H.hair_style == "Shaved") || !(H.hair_style == "Bald") || (HAIR in species_traits))
|
||||
to_chat(H, "<span class='danger'>Your hair starts to fall out in clumps...</span>")
|
||||
addtimer(CALLBACK(src, .proc/go_bald, H), 50)
|
||||
if(radiation > RAD_MOB_KNOCKDOWN)
|
||||
if(!H.IsKnockdown())
|
||||
H.emote("collapse")
|
||||
H.Knockdown(RAD_KNOCKDOWN_TIME)
|
||||
to_chat(H, "<span class='danger'>You feel weak.</span>")
|
||||
|
||||
if(radiation > RAD_MOB_MUTATE)
|
||||
if(prob(1))
|
||||
to_chat(H, "<span class='danger'>You mutate!</span>")
|
||||
H.randmutb()
|
||||
H.emote("gasp")
|
||||
H.domutcheck()
|
||||
|
||||
if(75 to 100)
|
||||
if(prob(1))
|
||||
to_chat(H, "<span class='danger'>You mutate!</span>")
|
||||
H.randmutb()
|
||||
H.emote("gasp")
|
||||
H.domutcheck()
|
||||
return 0
|
||||
H.radiation = 0
|
||||
return 1
|
||||
if(radiation > RAD_MOB_HAIRLOSS)
|
||||
if(prob(15))
|
||||
if(!( H.hair_style == "Shaved") || !(H.hair_style == "Bald") || (HAIR in species_traits))
|
||||
to_chat(H, "<span class='danger'>Your hair starts to fall out in clumps...</span>")
|
||||
addtimer(CALLBACK(src, .proc/go_bald, H), 50)
|
||||
|
||||
/datum/species/proc/go_bald(mob/living/carbon/human/H)
|
||||
if(QDELETED(H)) //may be called from a timer
|
||||
|
||||
@@ -295,7 +295,7 @@
|
||||
if(!active)
|
||||
if(world.time > last_event+30)
|
||||
active = 1
|
||||
radiation_pulse(get_turf(H), 3, 3, 5, 0)
|
||||
radiation_pulse(get_turf(H), 50)
|
||||
last_event = world.time
|
||||
active = null
|
||||
..()
|
||||
|
||||
@@ -280,24 +280,9 @@
|
||||
HM.force_lose(src)
|
||||
dna.temporary_mutations.Remove(mut)
|
||||
|
||||
if(radiation)
|
||||
radiation = Clamp(radiation, 0, 100)
|
||||
switch(radiation)
|
||||
if(0 to 50)
|
||||
radiation = max(radiation-1,0)
|
||||
if(prob(25))
|
||||
adjustToxLoss(1)
|
||||
|
||||
if(50 to 75)
|
||||
radiation = max(radiation-2,0)
|
||||
adjustToxLoss(1)
|
||||
if(prob(5))
|
||||
radiation = max(radiation-5,0)
|
||||
|
||||
if(75 to 100)
|
||||
radiation = max(radiation-3,0)
|
||||
adjustToxLoss(3)
|
||||
|
||||
radiation -= min(radiation, RAD_LOSS_PER_TICK)
|
||||
if(radiation > RAD_MOB_SAFE)
|
||||
adjustToxLoss(log(radiation-RAD_MOB_SAFE)*RAD_TOX_COEFFICIENT)
|
||||
|
||||
/mob/living/carbon/handle_stomach()
|
||||
set waitfor = 0
|
||||
|
||||
@@ -23,32 +23,23 @@
|
||||
walk_to(src,0)
|
||||
|
||||
/mob/living/carbon/monkey/handle_mutations_and_radiation()
|
||||
|
||||
if (radiation)
|
||||
if (radiation > 100)
|
||||
if(radiation)
|
||||
if(radiation > RAD_MOB_KNOCKDOWN)
|
||||
if(!IsKnockdown())
|
||||
emote("collapse")
|
||||
Knockdown(200)
|
||||
to_chat(src, "<span class='danger'>You feel weak.</span>")
|
||||
if(radiation > 30 && prob((radiation - 30) * (radiation - 30) * 0.0002))
|
||||
gorillize()
|
||||
return
|
||||
switch(radiation)
|
||||
if(radiation > RAD_MOB_MUTATE)
|
||||
if(prob(1))
|
||||
to_chat(src, "<span class='danger'>You mutate!</span>")
|
||||
randmutb()
|
||||
emote("gasp")
|
||||
domutcheck()
|
||||
|
||||
if(50 to 75)
|
||||
if(prob(5))
|
||||
if(!IsKnockdown())
|
||||
emote("collapse")
|
||||
Knockdown(60)
|
||||
to_chat(src, "<span class='danger'>You feel weak.</span>")
|
||||
|
||||
if(75 to 100)
|
||||
if(prob(1))
|
||||
to_chat(src, "<span class='danger'>You mutate!</span>")
|
||||
randmutb()
|
||||
emote("gasp")
|
||||
domutcheck()
|
||||
..()
|
||||
if(radiation > RAD_MOB_MUTATE * 2 && prob(50))
|
||||
gorillize()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath)
|
||||
if(abs(310.15 - breath.temperature) > 50)
|
||||
|
||||
@@ -885,6 +885,16 @@
|
||||
G.Recall()
|
||||
to_chat(G, "<span class='holoparasite'>Your summoner has changed form!</span>")
|
||||
|
||||
/mob/living/rad_act(amount)
|
||||
amount = max(amount-RAD_BACKGROUND_RADIATION, 0)
|
||||
|
||||
if(amount)
|
||||
var/blocked = getarmor(null, "rad")
|
||||
|
||||
apply_effect(amount * RAD_MOB_COEFFICIENT, IRRADIATE, blocked)
|
||||
if(amount > RAD_AMOUNT_EXTREME)
|
||||
apply_damage((amount-RAD_AMOUNT_EXTREME)/RAD_AMOUNT_EXTREME, BURN, null, blocked)
|
||||
|
||||
/mob/living/proc/fakefireextinguish()
|
||||
return
|
||||
|
||||
|
||||
@@ -363,7 +363,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne
|
||||
|
||||
|
||||
/obj/machinery/gravity_generator/main/proc/pulse_radiation()
|
||||
radiation_pulse(get_turf(src), 3, 7, 20)
|
||||
radiation_pulse(get_turf(src), 200)
|
||||
|
||||
// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged.
|
||||
/obj/machinery/gravity_generator/main/proc/shake_everyone()
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
..()
|
||||
add_avail(power_gen)
|
||||
if(panel_open && irradiate)
|
||||
radiation_pulse(get_turf(src), 2, 3, 6) // Weak but noticeable.
|
||||
radiation_pulse(get_turf(src), 60)
|
||||
|
||||
/obj/machinery/power/rtg/RefreshParts()
|
||||
var/part_level = 0
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
|
||||
GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
// last_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
|
||||
#define RAD_COLLECTOR_EFFICIENCY 80 // radiation needs to be over this amount to get power
|
||||
#define RAD_COLLECTOR_COEFFICIENT 100
|
||||
#define RAD_COLLECTOR_STORED_OUT 0.04 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source
|
||||
|
||||
/obj/machinery/power/rad_collector
|
||||
name = "Radiation Collector Array"
|
||||
@@ -21,12 +23,11 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
/obj/machinery/power/rad_collector/anchored
|
||||
anchored = TRUE
|
||||
|
||||
/obj/machinery/power/rad_collector/Initialize()
|
||||
/obj/machinery/power/rad_collector/ComponentInitialize()
|
||||
. = ..()
|
||||
GLOB.rad_collectors += src
|
||||
AddComponent(/datum/component/rad_insulation, RAD_EXTREME_INSULATION, FALSE, FALSE)
|
||||
|
||||
/obj/machinery/power/rad_collector/Destroy()
|
||||
GLOB.rad_collectors -= src
|
||||
return ..()
|
||||
|
||||
/obj/machinery/power/rad_collector/process()
|
||||
@@ -37,8 +38,10 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
else
|
||||
loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] -= 0.001*drainratio
|
||||
loaded_tank.air_contents.garbage_collect()
|
||||
return
|
||||
|
||||
var/power_produced = min(last_power, (last_power*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored
|
||||
add_avail(power_produced)
|
||||
last_power-=power_produced
|
||||
|
||||
/obj/machinery/power/rad_collector/attack_hand(mob/user)
|
||||
if(..())
|
||||
@@ -76,7 +79,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
|
||||
/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params)
|
||||
if(istype(W, /obj/item/device/multitool))
|
||||
to_chat(user, "<span class='notice'>The [W.name] detects that [last_power]W were recently produced.</span>")
|
||||
to_chat(user, "<span class='notice'>The [W.name] detects that [last_power]W is being processed.</span>")
|
||||
return TRUE
|
||||
else if(istype(W, /obj/item/device/analyzer) && loaded_tank)
|
||||
atmosanalyzer_scan(loaded_tank.air_contents, user)
|
||||
@@ -137,15 +140,9 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
else
|
||||
update_icons()
|
||||
|
||||
/obj/machinery/power/rad_collector/proc/receive_pulse(pulse_strength)
|
||||
if(loaded_tank && active)
|
||||
var/power_produced = loaded_tank.air_contents.gases[/datum/gas/plasma] ? loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] : 0
|
||||
power_produced *= pulse_strength*10
|
||||
add_avail(power_produced)
|
||||
last_power = power_produced
|
||||
return
|
||||
return
|
||||
|
||||
/obj/machinery/power/rad_collector/rad_act(pulse_strength)
|
||||
if(loaded_tank && active && pulse_strength > RAD_COLLECTOR_EFFICIENCY)
|
||||
last_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
|
||||
|
||||
/obj/machinery/power/rad_collector/proc/update_icons()
|
||||
cut_overlays()
|
||||
@@ -167,3 +164,7 @@ GLOBAL_LIST_EMPTY(rad_collectors)
|
||||
flick("ca_deactive", src)
|
||||
update_icons()
|
||||
return
|
||||
|
||||
#undef RAD_COLLECTOR_EFFICIENCY
|
||||
#undef RAD_COLLECTOR_COEFFICIENT
|
||||
#undef RAD_COLLECTOR_STORED_OUT
|
||||
@@ -114,7 +114,7 @@
|
||||
/obj/singularity/process()
|
||||
if(current_size >= STAGE_TWO)
|
||||
move()
|
||||
pulse()
|
||||
radiation_pulse(get_turf(src), energy, 0.5)
|
||||
if(prob(event_chance))//Chance for it to run a special event TODO:Come up with one or two more that fit
|
||||
event()
|
||||
eat()
|
||||
@@ -385,14 +385,10 @@
|
||||
|
||||
|
||||
/obj/singularity/proc/toxmob()
|
||||
var/toxrange = 10
|
||||
var/radiation = 15
|
||||
var/radiationmin = 3
|
||||
if (energy>200)
|
||||
radiation += round((energy-150)/10,1)
|
||||
radiationmin = round((radiation/5),1)
|
||||
for(var/mob/living/M in view(toxrange, src.loc))
|
||||
M.rad_act(rand(radiationmin,radiation))
|
||||
radiation_pulse(get_turf(src), radiation)
|
||||
|
||||
|
||||
/obj/singularity/proc/combust_mobs()
|
||||
@@ -428,12 +424,6 @@
|
||||
empulse(src, 8, 10)
|
||||
return
|
||||
|
||||
|
||||
/obj/singularity/proc/pulse()
|
||||
for(var/obj/machinery/power/rad_collector/R in GLOB.rad_collectors)
|
||||
if(R.z == z && get_dist(R, src) <= 15) // Better than using orange() every process
|
||||
R.receive_pulse(energy)
|
||||
|
||||
/obj/singularity/singularity_act()
|
||||
var/gain = (energy/2)
|
||||
var/dist = max((current_size - 2),1)
|
||||
|
||||
@@ -331,8 +331,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
|
||||
power = max( (removed.temperature * temp_factor / T0C) * gasmix_power_ratio + power, 0) //Total laser power plus an overload
|
||||
|
||||
//We've generated power, now let's transfer it to the collectors for storing/usage
|
||||
transfer_energy()
|
||||
if(prob(50))
|
||||
radiation_pulse(get_turf(src), power * (1 + power_transmission_bonus/10 * freon_transmit_modifier))
|
||||
|
||||
var/device_energy = power * REACTION_POWER_MODIFIER
|
||||
|
||||
@@ -527,11 +527,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
|
||||
Consume(nom)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/proc/transfer_energy()
|
||||
for(var/obj/machinery/power/rad_collector/R in GLOB.rad_collectors)
|
||||
if(R.z == z && get_dist(R, src) <= 15) //Better than using orange() every process
|
||||
R.receive_pulse(power * (1 + power_transmission_bonus)/10 * freon_transmit_modifier)
|
||||
|
||||
/obj/machinery/power/supermatter_shard/attackby(obj/item/W, mob/living/user, params)
|
||||
if(!istype(W) || (W.flags_1 & ABSTRACT_1) || !istype(user))
|
||||
return
|
||||
@@ -550,7 +545,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
Consume(W)
|
||||
playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, 1)
|
||||
|
||||
radiation_pulse(get_turf(src), 1, 1, 150, 1)
|
||||
radiation_pulse(get_turf(src), 150, 4)
|
||||
|
||||
|
||||
/obj/machinery/power/supermatter_shard/CollidedWith(atom/movable/AM)
|
||||
@@ -584,7 +579,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_shard)
|
||||
matter_power += 200
|
||||
|
||||
//Some poor sod got eaten, go ahead and irradiate people nearby.
|
||||
radiation_pulse(get_turf(src), 4, 10, 500, 1)
|
||||
radiation_pulse(get_turf(src), 3000, 2, TRUE)
|
||||
for(var/mob/living/L in range(10))
|
||||
investigate_log("has irradiated [L] after consuming [AM].", INVESTIGATE_SUPERMATTER)
|
||||
if(L in view())
|
||||
|
||||
@@ -454,7 +454,7 @@
|
||||
|
||||
/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/M)
|
||||
if(M.radiation > 0)
|
||||
M.radiation--
|
||||
M.radiation-=2
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/pen_acid
|
||||
@@ -466,11 +466,8 @@
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/M)
|
||||
if(M.radiation > 0)
|
||||
M.radiation -= 4
|
||||
M.radiation -= min(M.radiation, 8)
|
||||
M.adjustToxLoss(-2*REM, 0)
|
||||
if(M.radiation < 0)
|
||||
M.radiation = 0
|
||||
for(var/datum/reagent/R in M.reagents.reagent_list)
|
||||
if(R != src)
|
||||
M.reagents.remove_reagent(R.id,2)
|
||||
|
||||
@@ -15,6 +15,10 @@
|
||||
var/tomail = 0 //changes if contains wrapped package
|
||||
var/hasmob = 0 //If it contains a mob
|
||||
|
||||
/obj/structure/disposalholder/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
|
||||
|
||||
/obj/structure/disposalholder/Destroy()
|
||||
qdel(gas)
|
||||
active = 0
|
||||
@@ -176,6 +180,9 @@
|
||||
if("pipe-j2s")
|
||||
stored.ptype = DISP_SORTJUNCTION_FLIP
|
||||
|
||||
/obj/structure/disposalpipe/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
|
||||
|
||||
// pipe is deleted
|
||||
// ensure if holder is present, it is expelled
|
||||
@@ -639,6 +646,7 @@
|
||||
|
||||
/obj/structure/disposaloutlet/Initialize(mapload, obj/structure/disposalconstruct/make_from)
|
||||
. = ..()
|
||||
|
||||
if(make_from)
|
||||
setDir(make_from.dir)
|
||||
make_from.loc = src
|
||||
@@ -652,6 +660,10 @@
|
||||
if(trunk)
|
||||
trunk.linked = src // link the pipe trunk to self
|
||||
|
||||
/obj/structure/disposaloutlet/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
|
||||
|
||||
/obj/structure/disposaloutlet/Destroy()
|
||||
if(trunk)
|
||||
trunk.linked = null
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
/obj/machinery/disposal/Initialize(mapload, obj/structure/disposalconstruct/make_from)
|
||||
. = ..()
|
||||
|
||||
if(make_from)
|
||||
setDir(make_from.dir)
|
||||
make_from.loc = 0
|
||||
@@ -40,6 +41,12 @@
|
||||
//gas.volume = 1.05 * CELLSTANDARD
|
||||
update_icon()
|
||||
|
||||
return INITIALIZE_HINT_LATELOAD //we need turfs to have air
|
||||
|
||||
/obj/machinery/disposal/ComponentInitialize()
|
||||
. = ..()
|
||||
AddComponent(/datum/component/rad_insulation, RAD_NO_INSULATION)
|
||||
|
||||
/obj/machinery/disposal/proc/trunk_check()
|
||||
trunk = locate() in loc
|
||||
if(!trunk)
|
||||
@@ -62,10 +69,6 @@
|
||||
if(current_size >= STAGE_FIVE)
|
||||
deconstruct()
|
||||
|
||||
/obj/machinery/disposal/Initialize(mapload)
|
||||
..()
|
||||
return INITIALIZE_HINT_LATELOAD //we need turfs to have air
|
||||
|
||||
/obj/machinery/disposal/LateInitialize()
|
||||
//this will get a copy of the air turf and take a SEND PRESSURE amount of air from it
|
||||
var/atom/L = loc
|
||||
|
||||
@@ -255,7 +255,7 @@
|
||||
ejectItem()
|
||||
else if(prob(EFFECT_PROB_VERYLOW-badThingCoeff))
|
||||
visible_message("<span class='danger'>[src] malfunctions, melting [exp_on] and leaking radiation!</span>")
|
||||
radiation_pulse(get_turf(src), 1, 1, 25, 1)
|
||||
radiation_pulse(get_turf(src), 50)
|
||||
ejectItem(TRUE)
|
||||
else if(prob(EFFECT_PROB_LOW-badThingCoeff))
|
||||
visible_message("<span class='warning'>[src] malfunctions, spewing toxic waste!</span>")
|
||||
|
||||
Reference in New Issue
Block a user