mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-20 12:29:23 +01:00
c2f054fd81
Progress on DMDocs. PRing progress so far so there's not one mega PR later with 1500 affected files. I want my goddamn highlight text on what all these goddamn procs goddamn do goddamnit. >:( No actual code change anywhere in this PR, only comments. --------- Signed-off-by: Batrachophreno <Batrochophreno@gmail.com>
98 lines
3.2 KiB
Plaintext
98 lines
3.2 KiB
Plaintext
// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom.
|
|
// Sources will decay over time, unless something is renewing their power!
|
|
/datum/radiation_source
|
|
/// Location of the radiation source.
|
|
var/turf/source_turf
|
|
/// Strength of the radiation being emitted.
|
|
var/rad_power
|
|
/// True for automatic decay. False if owner promises to handle it (i.e. Supermatter, INDRA, etc.)
|
|
var/decay = TRUE
|
|
/// True for not affecting AREA_FLAG_RAD_SHIELDED areas.
|
|
var/respect_rad_shielding = FALSE
|
|
/// True for power falloff with distance.
|
|
var/flat = FALSE
|
|
/// Cached maximum range, used for quick checks against mobs.
|
|
var/range
|
|
|
|
/datum/radiation_source/New(source_turf, rad_power, decay = TRUE)
|
|
src.source_turf = source_turf
|
|
src.rad_power = rad_power
|
|
src.decay = decay
|
|
|
|
/datum/radiation_source/Destroy()
|
|
SSradiation.sources -= src
|
|
if(SSradiation.sources_assoc[src.source_turf] == src)
|
|
SSradiation.sources_assoc -= src.source_turf
|
|
src.source_turf = null
|
|
. = ..()
|
|
|
|
/**
|
|
* Initialization handling decaying sources. Decrease by RADIATION_DECAY_RATE per SSradiation.fire() in latter cases.
|
|
*/
|
|
/datum/radiation_source/proc/update_rad_power(new_power = null)
|
|
if(new_power == null || new_power == rad_power)
|
|
return // No change
|
|
else if(new_power <= RADIATION_LOWER_LIMIT)
|
|
qdel(src) // Decayed to nothing
|
|
else
|
|
rad_power = new_power
|
|
if(!flat)
|
|
// R = rad_power / dist**2 - Solve for dist
|
|
range = min(round(sqrt(rad_power / RADIATION_LOWER_LIMIT)), 31)
|
|
|
|
/turf/var/cached_rad_resistance = 0
|
|
|
|
/turf/proc/calc_rad_resistance()
|
|
cached_rad_resistance = 0
|
|
for(var/obj/O in src.contents)
|
|
if(!(O.rad_resistance_modifier <= 0) && O.density)
|
|
var/material/M = O.get_material()
|
|
if(!M) continue
|
|
cached_rad_resistance += (M.weight * O.rad_resistance_modifier) / RADIATION_MATERIAL_RESISTANCE_DIVISOR
|
|
// Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana
|
|
SSradiation.resistance_cache[src] = (length(contents) + 1)
|
|
|
|
/turf/simulated/wall/calc_rad_resistance()
|
|
SSradiation.resistance_cache[src] = (length(contents) + 1)
|
|
cached_rad_resistance = (density ? material.weight / RADIATION_MATERIAL_RESISTANCE_DIVISOR : 0)
|
|
|
|
/obj
|
|
/// Allow overriding rad resistance.
|
|
var/rad_resistance_modifier = 1
|
|
|
|
/**
|
|
* Retrieves the atom's current radiation level. By default, this will return `loc.get_rads()`.
|
|
*
|
|
* Returns integer.
|
|
*/
|
|
/atom/proc/get_rads()
|
|
if(loc)
|
|
return loc.get_rads()
|
|
return 0
|
|
|
|
/turf/get_rads()
|
|
return SSradiation.get_rads_at_turf(src)
|
|
|
|
/**
|
|
* Called when radiation affects the atom.
|
|
*
|
|
* * severity - The amount of radiation being applied. Also see RAD_LEVEL_*.
|
|
*
|
|
* Returns boolean
|
|
*/
|
|
/atom/proc/rad_act(severity)
|
|
return 1
|
|
|
|
/**
|
|
* Called when radiation affects a /mob/living.
|
|
*
|
|
* * severity - The amount of radiation being applied. Anything over RAD_LEVEL_LOW will deal [severity] dispersed damage and run rad_act to everything in it.
|
|
*
|
|
* Returns boolean
|
|
*/
|
|
/mob/living/rad_act(severity)
|
|
if(severity > RAD_LEVEL_LOW)
|
|
apply_damage(severity, DAMAGE_RADIATION, damage_flags = DAMAGE_FLAG_DISPERSED)
|
|
for(var/atom/I in src)
|
|
I.rad_act(severity)
|