mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-06-05 05:24:36 +01:00
84dc5535dc
* These two are easy * !!!runlevel_flags the fact it was global.runlevel_flags.len has me a bit...iffy on this. * !!!json_cache Same as above. used global. * player_list & observer_mob_list * mechas_list * this wasn't even used * surgery_steps * event_triggers * landmarks_list * dead_mob_list * living_mob_list * ai_list * cable_list * cleanbot_reserved_turfs * listening_objects * silicon_mob_list * human_mob_list * Update global_lists.dm * joblist * mob_list * Update global_lists.dm * holomap_markers * mapping_units * mapping_beacons * hair_styles_list * facial_hair_styles_list * Update global_lists.dm * facial_hair_styles_male_list * facial_hair_styles_female_list * body_marking_styles_list * body_marking_nopersist_list * ear_styles_list * hair_styles_male_list * tail_styles_list * wing_styles_list * escape_list & rune_list & endgame_exits these were all really small * endgame_safespawns * stool_cache * emotes_by_key * random_maps & map_count * item_tf_spawnpoints * narsie_list * active_radio_jammers * unused * paikeys * pai_software_by_key & default_pai_software * plant_seed_sprites * magazine_icondata_keys & magazine_icondata_states * unused * ashtray_cache * light_type_cache * HOLIDAY!!! this one was annoying * faction stuff (red?!) * Update preferences_factions.dm * vs edit removal * backbaglist, pdachoicelist, exclude_jobs * item_digestion_blacklist, edible_tech, blacklisted_artifact_effect, selectable_footstep, hexNums, syndicate_access * string_slot_flags and hexdigits->hexNums * possible_changeling_IDs * vr_mob_tf_options * vr_mob_spawner_options * pipe_colors * vr_mob_spawner_options * common_tools * newscaster_standard_feeds * Update periodic_news.dm * changeling_fabricated_clothing * semirandom_mob_spawner_decisions * id_card_states * Update syndicate_ids.dm * overlay_cache & gear_distributed_to * more * radio_channels_by_freq * Update global_lists.dm * proper * default_medbay_channels & default_internal_channels default_internal_channels is weird as it has a mapbased proc() but that proc is never called... * valid_ringtones * move this * possible_plants * more * separate these moves xeno2chemlist from a hook to a new global list. * tube_dir_list * valid_bloodreagents & monitor_states * Junk * valid_bloodtypes * breach_burn_descriptors & burn * more!! appliance_available_recipes seems uber cursed, re-look at later * Appliance code is cursed * wide_chassis & flying_chassis * allows_eye_color * all_tooltip_styles * direction_table * gun_choices * severity_to_string * old event_viruses * description_icons * MOVE_KEY_MAPPINGS * more more * pai & robot modules * Update global_lists.dm * GEOSAMPLES Also swaps a .len to LAZYLEN() * shieldgens * reagent recipies * global ammo types * rad collector * old file and unused global * nif_look_messages * FESH * nifsoft * chamelion * the death of sortAtom * globulins * lazylen that * Update global_lists.dm * LAZY * Theese too * quick fix --------- Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
149 lines
5.1 KiB
Plaintext
149 lines
5.1 KiB
Plaintext
SUBSYSTEM_DEF(radiation)
|
|
name = "Radiation"
|
|
wait = 2 SECONDS
|
|
flags = SS_NO_INIT
|
|
|
|
var/list/sources = list() // all radiation source datums
|
|
var/list/sources_assoc = list() // Sources indexed by turf for de-duplication.
|
|
var/list/resistance_cache = list() // Cache of turf's radiation resistance.
|
|
|
|
var/tmp/list/current_sources = list()
|
|
var/tmp/list/current_res_cache = list()
|
|
var/tmp/list/listeners = list()
|
|
|
|
/datum/controller/subsystem/radiation/fire(resumed = FALSE)
|
|
if (!resumed)
|
|
current_sources = sources.Copy()
|
|
current_res_cache = resistance_cache.Copy()
|
|
listeners = GLOB.living_mob_list.Copy()
|
|
|
|
while(current_sources.len)
|
|
var/datum/radiation_source/S = current_sources[current_sources.len]
|
|
current_sources.len--
|
|
|
|
if(QDELETED(S))
|
|
sources -= S
|
|
else if(S.decay)
|
|
S.update_rad_power(S.rad_power - CONFIG_GET(number/radiation_decay_rate))
|
|
if (MC_TICK_CHECK)
|
|
return
|
|
|
|
while(current_res_cache.len)
|
|
var/turf/T = current_res_cache[current_res_cache.len]
|
|
current_res_cache.len--
|
|
|
|
if(QDELETED(T))
|
|
resistance_cache -= T
|
|
else if((length(T.contents) + 1) != resistance_cache[T])
|
|
resistance_cache -= T // If its stale REMOVE it! It will get added if its needed.
|
|
if (MC_TICK_CHECK)
|
|
return
|
|
|
|
if(!sources.len)
|
|
listeners.Cut()
|
|
|
|
while(listeners.len)
|
|
var/atom/A = listeners[listeners.len]
|
|
listeners.len--
|
|
|
|
if(!QDELETED(A))
|
|
var/turf/T = get_turf(A)
|
|
var/rads = get_rads_at_turf(T)
|
|
if(rads)
|
|
A.rad_act(rads)
|
|
if (MC_TICK_CHECK)
|
|
return
|
|
|
|
/datum/controller/subsystem/radiation/stat_entry(msg)
|
|
msg = "S:[sources.len], RC:[resistance_cache.len]"
|
|
return ..()
|
|
|
|
// Ray trace from all active radiation sources to T and return the strongest effect.
|
|
/datum/controller/subsystem/radiation/proc/get_rads_at_turf(var/turf/T)
|
|
. = 0
|
|
if(!istype(T))
|
|
return
|
|
|
|
for(var/datum/radiation_source/source as anything in sources)
|
|
if(source.rad_power < .)
|
|
continue // Already being affected by a stronger source
|
|
|
|
if(source.source_turf.z != T.z)
|
|
continue // Radiation is not multi-z
|
|
|
|
if(source.respect_maint)
|
|
var/area/A = T.loc
|
|
if(A.flag_check(RAD_SHIELDED))
|
|
continue // In shielded area
|
|
|
|
var/dist = get_dist(source.source_turf, T)
|
|
if(dist > source.range)
|
|
continue // Too far to possibly affect
|
|
|
|
if(source.flat)
|
|
. += source.rad_power
|
|
continue // No need to ray trace for flat field
|
|
|
|
// Okay, now ray trace to find resistence!
|
|
var/turf/origin = source.source_turf
|
|
var/working = source.rad_power
|
|
while(origin != T)
|
|
origin = get_step_towards(origin, T) //Raytracing
|
|
if(!resistance_cache[origin]) //Only get the resistance if we don't already know it.
|
|
origin.calc_rad_resistance()
|
|
|
|
if(origin.cached_rad_resistance)
|
|
if(CONFIG_GET(flag/radiation_resistance_calc_mode) == RAD_RESIST_CALC_DIV)
|
|
working = round((working / (origin.cached_rad_resistance * CONFIG_GET(number/radiation_resistance_multiplier))), 0.01)
|
|
else if(CONFIG_GET(flag/radiation_resistance_calc_mode) == RAD_RESIST_CALC_SUB)
|
|
working = round((working - (origin.cached_rad_resistance * CONFIG_GET(number/radiation_resistance_multiplier))), 0.01)
|
|
|
|
if(working <= CONFIG_GET(number/radiation_lower_limit)) // Too far from this source
|
|
working = 0 // May as well be 0
|
|
break
|
|
|
|
// Accumulate radiation from all sources in range, not just the biggest.
|
|
// Shouldn't really ever have practical uses, but standing in a room literally made from uranium is more dangerous than standing next to a single uranium vase
|
|
. += working / (dist ** 2)
|
|
|
|
if(. <= CONFIG_GET(number/radiation_lower_limit))
|
|
. = 0
|
|
|
|
// Add a radiation source instance to the repository. It will override any existing source on the same turf.
|
|
/datum/controller/subsystem/radiation/proc/add_source(var/datum/radiation_source/S)
|
|
if(!isturf(S.source_turf))
|
|
return
|
|
var/datum/radiation_source/existing = sources_assoc[S.source_turf]
|
|
if(existing)
|
|
qdel(existing)
|
|
sources += S
|
|
sources_assoc[S.source_turf] = S
|
|
|
|
// Creates a temporary radiation source that will decay
|
|
/datum/controller/subsystem/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account
|
|
if(!(source && power)) //Sanity checking
|
|
return
|
|
var/datum/radiation_source/S = new()
|
|
S.source_turf = get_turf(source)
|
|
S.update_rad_power(power)
|
|
add_source(S)
|
|
|
|
// Sets the radiation in a range to a constant value.
|
|
/datum/controller/subsystem/radiation/proc/flat_radiate(source, power, range, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
|
if(!(source && power && range))
|
|
return
|
|
var/datum/radiation_source/S = new()
|
|
S.flat = TRUE
|
|
S.range = range
|
|
S.respect_maint = respect_maint
|
|
S.source_turf = get_turf(source)
|
|
S.update_rad_power(power)
|
|
add_source(S)
|
|
|
|
// Irradiates a full Z-level. Hacky way of doing it, but not too expensive.
|
|
/datum/controller/subsystem/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = TRUE) //VOREStation edit; Respect shielded areas by default please.
|
|
if(!(power && source))
|
|
return
|
|
var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z)
|
|
flat_radiate(epicentre, power, world.maxx, respect_maint)
|