From c95df78a549e4a1bc07cafd3fc37f9838b6ee89b Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 15:33:29 +0100 Subject: [PATCH 01/10] Fixes a bug with healthy analzyers and adds radiation showing to them, from Bay --- code/game/objects/items/devices/scanners.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5d883784aa0..6399d0ce4a7 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -69,7 +69,7 @@ REAGENT SCANNER user.show_message("Analyzing Results for [M]:") user.show_message("Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.getMaxHealth())*100) ]% healthy"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health*100/M.maxHealth)]% healthy"]") user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) @@ -99,6 +99,10 @@ REAGENT SCANNER if(M.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") + if(M.radiation) + user.show_message("Radiation Level: [M.radiation]") + else + user.show_message("No radiation detected.") if(istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M if(C.reagents.total_volume) From 6185bbd212c9085fd69bc1769e1ca5f0d754d5af Mon Sep 17 00:00:00 2001 From: Ben Reeve Date: Thu, 15 Dec 2016 19:07:39 +0000 Subject: [PATCH 02/10] Unified radiation system --- code/controllers/Processes/radiation.dm | 43 +++++++ code/controllers/configuration.dm | 4 + code/datums/repositories/radiation.dm | 114 ++++++++++++++++++ code/game/atoms_movable.dm | 3 + code/game/gamemodes/meteor/meteors.dm | 3 +- code/game/machinery/doors/airlock.dm | 13 +- code/game/machinery/doors/blast_door.dm | 11 +- code/game/machinery/doors/door.dm | 2 + code/game/machinery/vending.dm | 2 +- code/game/mecha/equipment/tools/tools.dm | 6 +- code/game/objects/items/devices/geiger.dm | 53 ++++++++ .../crates_lockers/closets/utility_closets.dm | 2 + code/game/turfs/simulated/wall_attacks.dm | 2 + code/game/turfs/simulated/wall_icon.dm | 1 + code/game/turfs/simulated/walls.dm | 6 +- code/game/turfs/turf.dm | 11 +- code/modules/events/event_container.dm | 2 +- code/modules/events/radiation_storm.dm | 10 +- code/modules/events/solar_storm.dm | 17 ++- code/modules/mining/mine_turfs.dm | 4 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 2 + code/modules/power/port_gen.dm | 8 +- code/modules/power/singularity/collector.dm | 5 + code/modules/power/singularity/singularity.dm | 10 +- code/modules/supermatter/supermatter.dm | 22 +++- .../xenoarcheaology/effects/radiate.dm | 10 +- .../tools/geosample_scanner.dm | 5 +- html/changelogs/cirra-Radiation.yml | 37 ++++++ icons/obj/device.dmi | Bin 51528 -> 55614 bytes polaris.dme | 3 + 31 files changed, 337 insertions(+), 76 deletions(-) create mode 100644 code/controllers/Processes/radiation.dm create mode 100644 code/datums/repositories/radiation.dm create mode 100644 code/game/objects/items/devices/geiger.dm create mode 100644 html/changelogs/cirra-Radiation.yml diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm new file mode 100644 index 00000000000..8ebd3a71a8e --- /dev/null +++ b/code/controllers/Processes/radiation.dm @@ -0,0 +1,43 @@ +/datum/controller/process/radiation + var/repository/radiation/linked = null + +/datum/controller/process/radiation/setup() + name = "radiation controller" + schedule_interval = 20 // every 2 seconds + linked = radiation_repository + +/datum/controller/process/radiation/doWork() +// set background = 1 + for(var/turf/T in linked.irradiated_turfs) + if(!T) + linked.irradiated_turfs.Remove(T) + continue + linked.irradiated_turfs[T] -= config.radiation_decay_rate + if(linked.irradiated_turfs[T] <= config.radiation_lower_limit) + linked.irradiated_turfs.Remove(T) + SCHECK + for(var/mob/living/L in linked.irradiated_mobs) + if(!L) + linked.irradiated_mobs.Remove(L) + continue + if(get_turf(L) in linked.irradiated_turfs) + L.rad_act(linked.irradiated_turfs[get_turf(L)]) + if(!L.radiation) + linked.irradiated_mobs.Remove(L) + SCHECK + for(var/thing in linked.sources) + if(!thing) + linked.sources.Remove(thing) + continue + var/atom/emitter = thing + linked.radiate(emitter, emitter.rad_power) + to_process.Cut() + SCHECK + for(var/thing in linked.resistance_cache) + if(!thing) + linked.resistance_cache.Remove(thing) + continue + var/turf/T = thing + if((length(T.contents) + 1) != linked.resistance_cache[T]) + T.calc_rad_resistance() + SCHECK \ No newline at end of file diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 5021453462e..c22ac1bc81f 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -219,6 +219,10 @@ var/list/gamemode_cache = list() var/show_human_death_message = 1 + var/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/radiation_resistance_multiplier = 6.5 + var/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm new file mode 100644 index 00000000000..bdf2b183226 --- /dev/null +++ b/code/datums/repositories/radiation.dm @@ -0,0 +1,114 @@ +//#define RADDBG + +var/repository/radiation/radiation_repository = new() + +var/list/to_process = list() + +/repository/radiation + var/list/sources = list() //All the radiation sources we know about + var/list/irradiated_turfs = list() + var/list/irradiated_mobs = list() + var/list/resistance_cache = list() + +/repository/radiation/proc/report_rads(var/turf/T as turf) + return irradiated_turfs[T] + +/repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account + if(!(source && power)) //Sanity checking + return + + var/range = min(round(sqrt(power / config.radiation_lower_limit)), 31) + var/turf/epicentre = get_turf(source) + to_process = list() + + range = min(epicentre.x, world.maxx - epicentre.x, epicentre.y, world.maxy - epicentre.y, range) + + to_process = trange(range, epicentre) + to_process[epicentre] = power + + for(var/turf/spot in to_process) + var/turf/origin = get_turf(epicentre) + var/working = power + while(origin != spot) + origin = get_step_towards(origin, spot) //Raytracing + if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. + origin.calc_rad_resistance() + working = max((working - (origin.rad_resistance * config.radiation_resistance_multiplier)), 0) + if(!working) + break + if(!to_process[origin]) + to_process[origin] = working + + else + to_process[origin] = max(to_process[origin], working) + + for(var/turf/spot in to_process) + irradiated_turfs[spot] = max(((to_process[spot]) * (1 / (get_dist(epicentre, spot) ** 2))), irradiated_turfs[spot]) //Butchered version of the inverse square law. Works for this purpose + #ifdef RADDBG + var/x = Clamp( irradiated_turfs[spot], 0, 255) + spot.color = rgb(5,x,5) + #endif + +/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint=0) //Sets the radiation in a range to a constant value. + if(!(source && power && range)) + return + var/turf/epicentre = get_turf(source) + range = min(epicentre.x, world.maxx - epicentre.x, epicentre.y, world.maxy - epicentre.y, range) + if(!respect_maint) + for(var/turf/T in trange(range, epicentre)) + irradiated_turfs[T] = max(power, irradiated_turfs[T]) + else + for(var/turf/T in trange(range, epicentre)) + var/area/A = T.loc + if(A.flags & RAD_SHIELDED) + continue + irradiated_turfs[T] = max(power, irradiated_turfs[T]) + +/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint=0) //Irradiates a full Z-level. Hacky way of doing it, but not too expensive. + 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) + +/turf/proc/calc_rad_resistance() + rad_resistance = 0 + for(var/obj/O in src.contents) + if(O.rad_resistance) //Override + rad_resistance += O.rad_resistance + + else if(O.density) //So doors don't get counted + var/material/M = O.get_material() + if(!M) continue + rad_resistance += M.weight + radiation_repository.resistance_cache[src] = (length(contents) + 1) + +/turf/simulated/wall/calc_rad_resistance() + radiation_repository.resistance_cache[src] = (length(contents) + 1) + rad_resistance = (density ? material.weight : 0) + +/atom + var/rad_power = 0 + var/rad_resistance = 0 + +/atom/Destroy() + if(rad_power) + radiation_repository.sources.Remove(src) + . = ..() + +/atom/proc/update_radiation() //For VV'ing something to make it radioactive at runtime + if((rad_power) && (!(src in radiation_repository.sources))) + radiation_repository.sources.Add(src) + else if((!rad_power) && (src in radiation_repository.sources)) + radiation_repository.sources.Remove(src) + +/atom/proc/rad_act(var/severity) //If people expand the system, this may be useful. Here as a placeholder until then + return 1 + +/mob/living/rad_act(var/severity) + if(severity) + src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) + for(var/obj/I in src) + I.rad_act(severity) + + +//#undef RADDBG \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index fe9f99b0328..82061ddb6ad 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -53,6 +53,9 @@ pulledby = null /atom/movable/proc/initialize() + if(rad_power) + radiation_repository.sources.Add(src) + if(!isnull(gcDestroyed)) crash_with("GC: -- [type] had initialize() called after qdel() --") diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index ad8b89ec804..c5096d12d8b 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -271,8 +271,7 @@ if(explode) explosion(src.loc, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 4, flash_range = 6, adminlog = 0) new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - for(var/mob/living/L in view(10, src)) - L.apply_effect(40, IRRADIATE) + radiation_repository.radiate(src, 50) // This meteor fries toasters. /obj/effect/meteor/emp diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index e78cba35688..c1ec9287b0e 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -263,6 +263,7 @@ icon = 'icons/obj/doors/Dooruranium.dmi' mineral = "uranium" var/last_event = 0 + rad_power = 7.5 /obj/machinery/door/airlock/process() // Deliberate no call to parent. @@ -277,18 +278,6 @@ ..() -/obj/machinery/door/airlock/uranium/process() - if(world.time > last_event+20) - if(prob(50)) - radiate() - last_event = world.time - ..() - -/obj/machinery/door/airlock/uranium/proc/radiate() - for(var/mob/living/L in range (3,src)) - L.apply_effect(15,IRRADIATE,0) - return - /obj/machinery/door/airlock/phoron name = "Phoron Airlock" desc = "No way this can end badly." diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 3d899377cca..f8e1d1cbb59 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -13,7 +13,7 @@ icon = 'icons/obj/doors/rapid_pdoor.dmi' icon_state = null min_force = 20 //minimum amount of force needed to damage the door with a melee weapon - + var/material/implicit_material // Icon states for different shutter types. Simply change this instead of rewriting the update_icon proc. var/icon_state_open = null var/icon_state_opening = null @@ -29,6 +29,13 @@ //turning this off prevents awkward zone geometry in places like medbay lobby, for example. block_air_zones = 0 +/obj/machinery/door/blast/initialize() + ..() + implicit_material = get_material_by_name("plasteel") + +/obj/machinery/door/blast/get_material() + return implicit_material + // Proc: Bumped() // Parameters: 1 (AM - Atom that tried to walk through this object) // Description: If we are open returns zero, otherwise returns result of parent function. @@ -46,6 +53,8 @@ icon_state = icon_state_closed else icon_state = icon_state_open + var/turf/T = get_turf(src) + T.calc_rad_resistance() return // Proc: force_open() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 7a1d6abd026..898683192ff 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -362,6 +362,8 @@ icon_state = "door1" else icon_state = "door0" + var/turf/T = get_turf(src) + T.calc_rad_resistance() return diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 3d53a053f05..58bed70d075 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1029,7 +1029,7 @@ icon_state = "engivend" icon_deny = "engivend-deny" req_access = list(access_engine_equip) - products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10, + products = list(/obj/item/device/geiger = 4,/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10, /obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10, /obj/item/weapon/circuitboard/airalarm = 10,/obj/item/weapon/circuitboard/firealarm = 10,/obj/item/weapon/circuitboard/status_display = 2, /obj/item/weapon/circuitboard/ai_status_display = 2,/obj/item/weapon/circuitboard/newscaster = 2,/obj/item/weapon/circuitboard/holopad = 2, diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 9b2e0aa26dc..4d7ee902d8c 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -973,11 +973,7 @@ process(var/obj/item/mecha_parts/mecha_equipment/generator/nuclear/EG) if(..()) - for(var/mob/living/carbon/M in view(EG.chassis)) - if(istype(M,/mob/living/carbon/human)) - M.apply_effect((EG.rad_per_cycle*3),IRRADIATE,0) - else - M.apply_effect(EG.rad_per_cycle, IRRADIATE) + radiation_repository.radiate(EG, (EG.rad_per_cycle * 3)) return 1 diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm new file mode 100644 index 00000000000..acd85b730c5 --- /dev/null +++ b/code/game/objects/items/devices/geiger.dm @@ -0,0 +1,53 @@ +#define RAD_LEVEL_LOW 5 //10 // Around the level at which radiation starts to become harmful +#define RAD_LEVEL_MODERATE 15 //15 +#define RAD_LEVEL_HIGH 50 //50 +#define RAD_LEVEL_VERY_HIGH 100 //100 + +//Geiger counter +//Rewritten version of TG's geiger counter +//I opted to show exact radiation levels + +/obj/item/device/geiger + name = "geiger counter" + desc = "A handheld device used for detecting and measuring radiation in an area." + icon_state = "geiger_off" + item_state = "multitool" + w_class = ITEMSIZE_SMALL + var/scanning = 0 + var/radiation_count = 0 + +/obj/item/device/geiger/New() + processing_objects |= src + +/obj/item/device/geiger/process() + if(!scanning) + return + radiation_count = radiation_repository.report_rads(get_turf(src)) + update_icon() + +/obj/item/device/geiger/examine(mob/user) + ..(user) + to_chat(user, "[scanning ? "ambient" : "stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.") + +/obj/item/device/geiger/attack_self(var/mob/user) + scanning = !scanning + update_icon() + to_chat(user, "\icon[src] You switch [scanning ? "on" : "off"] [src].") + +/obj/item/device/geiger/update_icon() + if(!scanning) + icon_state = "geiger_off" + return 1 + + switch(radiation_count) + if(null) icon_state = "geiger_on_1" + if(-INFINITY to RAD_LEVEL_LOW) icon_state = "geiger_on_1" + if(RAD_LEVEL_LOW + 1 to RAD_LEVEL_MODERATE) icon_state = "geiger_on_2" + if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH) icon_state = "geiger_on_3" + if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH) icon_state = "geiger_on_4" + if(RAD_LEVEL_VERY_HIGH + 1 to INFINITY) icon_state = "geiger_on_5" + +#undef RAD_LEVEL_LOW +#undef RAD_LEVEL_MODERATE +#undef RAD_LEVEL_HIGH +#undef RAD_LEVEL_VERY_HIGH \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 5c8aa2b2e02..67a4d3e788e 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -155,6 +155,8 @@ new /obj/item/clothing/head/radiation(src) new /obj/item/clothing/suit/radiation(src) new /obj/item/clothing/head/radiation(src) + new /obj/item/device/geiger(src) + new /obj/item/device/geiger(src) /* * Bombsuit closet diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 098782ebdf0..b236e4dc904 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -7,6 +7,8 @@ if(can_open == WALL_OPENING) return + calc_rad_resistance() + if(density) can_open = WALL_OPENING //flick("[material.icon_base]fwall_opening", src) diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index dc7874b2aaf..757639e1bba 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -26,6 +26,7 @@ else if(material.opacity < 0.5 && opacity) set_light(0) + calc_rad_resistance() update_connections(1) update_icon() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index f8544e714d4..376fb8e452a 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -48,6 +48,9 @@ if(!radiate()) return PROCESS_KILL +/turf/simulated/wall/proc/get_material() + return material + /turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj,/obj/item/projectile/beam)) burn(2500) @@ -265,8 +268,7 @@ if(!total_radiation) return - for(var/mob/living/L in range(3,src)) - L.apply_effect(total_radiation, IRRADIATE,0) + radiation_repository.radiate(src, total_radiation) return total_radiation /turf/simulated/wall/proc/burn(temperature) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3f2e0064f22..87b4b2b6486 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -140,6 +140,12 @@ var/const/enterloopsanity = 100 if(ismob(A)) var/mob/M = A + var/mob/living/L = A + if(istype(L)) + if(!(L in radiation_repository.irradiated_mobs)) + if(src in radiation_repository.irradiated_turfs) + radiation_repository.irradiated_mobs.Add(L) + L.handle_footstep(src) if(!M.lastarea) M.lastarea = get_area(M.loc) if(M.lastarea.has_gravity == 0) @@ -147,9 +153,6 @@ var/const/enterloopsanity = 100 else if(!is_space()) M.inertia_dir = 0 M.make_floating(0) - if(isliving(M)) - var/mob/living/L = M - L.handle_footstep(src) ..() var/objects = 0 if(A && (A.flags & PROXMOVE)) @@ -255,4 +258,4 @@ var/const/enterloopsanity = 100 step(AM, turn(AM.last_move, 180)) if(isliving(AM)) var/mob/living/M = AM - M.turf_collision(src, speed) + M.turf_collision(src, speed) \ No newline at end of file diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 37a576a4420..804d13404dc 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -186,4 +186,4 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT #undef ASSIGNMENT_JANITOR #undef ASSIGNMENT_MEDICAL #undef ASSIGNMENT_SCIENTIST -#undef ASSIGNMENT_SECURITY +#undef ASSIGNMENT_SECURITY \ No newline at end of file diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index b9435f25aa4..a8c9386fde2 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -30,20 +30,18 @@ command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") /datum/event/radiation_storm/proc/radiate() + var/radiation_level = rand(15, 35) + for(var/z in using_map.station_levels) + radiation_repository.z_radiate(locate(1, 1, z), radiation_level, 1) + for(var/mob/living/carbon/C in living_mob_list) var/area/A = get_area(C) if(!A) continue - if(!(A.z in using_map.station_levels)) - continue - if(A.flags & RAD_SHIELDED) - continue if(istype(C,/mob/living/carbon/human)) var/mob/living/carbon/human/H = C - H.apply_effect((rand(15,35)),IRRADIATE,0) if(prob(5)) - H.apply_effect((rand(40,70)),IRRADIATE,0) if (prob(75)) randmutb(H) // Applies bad mutation domutcheck(H,null,MUTCHK_FORCED) diff --git a/code/modules/events/solar_storm.dm b/code/modules/events/solar_storm.dm index 971e0418bc9..4ebfc71d555 100644 --- a/code/modules/events/solar_storm.dm +++ b/code/modules/events/solar_storm.dm @@ -27,17 +27,14 @@ radiate() /datum/event/solar_storm/proc/radiate() - for(var/mob/living/L in living_mob_list) - var/turf/T = get_turf(L) - if(!T) + var/radiation_level = rand(15, 30) + for(var/area/A in all_areas) + if(!(A.z in using_map.player_levels)) continue - - if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) //Make sure you're in a space area or on a space turf - continue - - //Todo: Apply some burn damage from the heat of the sun. Until then, enjoy some moderate radiation. - L.apply_effect((rand(15,30)),IRRADIATE,blocked = L.getarmor(null, "rad")) - + for(var/turf/T in A) + if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) + continue + radiation_repository.irradiated_turfs[T] = radiation_level /datum/event/solar_storm/end() command_announcement.Announce("The solar storm has passed the station. It is now safe to resume EVA activities. Please report to medbay if you experience any unusual symptoms. ", "Anomaly Alert") diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index bf59f3c3826..68363fb27fa 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -482,7 +482,7 @@ var/list/mining_overlay_cache = list() M.flash_eyes() if(prob(50)) M.Stun(5) - M.apply_effect(25, IRRADIATE) + radiation_repository.flat_radiate(src, 25, 200) if(prob(25)) excavate_find(prob(5), finds[1]) else if(rand(1,500) == 1) @@ -559,4 +559,4 @@ var/list/mining_overlay_cache = list() if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] UpdateMineral() - update_icon() + update_icon() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 61b13316b84..8f7398e0a86 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -94,7 +94,7 @@ emp_act var/obj/item/organ/external/organ = organs_by_name[organ_name] if(organ) var/weight = organ_rel_size[organ_name] - armorval += getarmor_organ(organ, type) * weight + armorval += (getarmor_organ(organ, type) * weight) total += weight return (armorval/max(total, 1)) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 795e535ebfd..4b2c7f6f79b 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -352,6 +352,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/device/geiger(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal() var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() @@ -396,6 +397,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) src.emag = new /obj/item/weapon/melee/baton/robot/arm(src) + src.modules += new /obj/item/device/geiger(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index f900f6fcf45..6a40cf3b8ea 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -396,17 +396,13 @@ /obj/machinery/power/port_gen/pacman/super/UseFuel() //produces a tiny amount of radiation when in use if (prob(2*power_output)) - for (var/mob/living/L in range(src, 5)) - L.apply_effect(1, IRRADIATE) //should amount to ~5 rads per minute at max safe power + radiation_repository.radiate(src, 4) ..() /obj/machinery/power/port_gen/pacman/super/explode() //a nice burst of radiation var/rads = 50 + (sheets + sheet_left)*1.5 - for (var/mob/living/L in range(src, 10)) - //should really fall with the square of the distance, but that makes the rads value drop too fast - //I dunno, maybe physics works different when you live in 2D -- SM radiation also works like this, apparently - L.apply_effect(max(20, round(rads/get_dist(L,src))), IRRADIATE) + radiation_repository.radiate(src, (max(20, rads))) explosion(src.loc, 3, 3, 5, 3) qdel(src) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index dee15d9f140..ba817d392a0 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -31,6 +31,11 @@ var/global/list/rad_collectors = list() last_power_new = 0 + var/turf/T = get_turf(src) + if(T in radiation_repository.irradiated_turfs) + receive_pulse((radiation_repository.irradiated_turfs[T] * 5)) //Maths is hard + + if(P) if(P.air_contents.gas["phoron"] == 0) investigate_log("out of fuel.","singulo") diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 39090ceac50..9309c6bd3cc 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -406,15 +406,13 @@ var/toxrange = 10 var/toxdamage = 4 var/radiation = 15 - var/radiationmin = 3 if (src.energy>200) toxdamage = round(((src.energy-150)/50)*4,1) radiation = round(((src.energy-150)/50)*5,1) - radiationmin = round((radiation/5),1)// + radiation_repository.radiate(src, radiation) //Always radiate at max, so a decent dose of radiation is applied for(var/mob/living/M in view(toxrange, src.loc)) if(M.status_flags & GODMODE) continue - M.apply_effect(rand(radiationmin,radiation), IRRADIATE) toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad"))) M.apply_effect(toxdamage, TOX) return @@ -448,13 +446,13 @@ /obj/singularity/proc/smwave() for(var/mob/living/M in view(10, src.loc)) if(prob(67)) - M.apply_effect(rand(energy), IRRADIATE) - M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." - M << "Miraculously, it fails to kill you." + to_chat(M, "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") + to_chat(M, "Miraculously, it fails to kill you.") else M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." M << "You don't even have a moment to react as you are reduced to ashes by the intense radiation." M.dust() + radiation_repository.radiate(src, rand(energy)) return /obj/singularity/proc/pulse() diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 1ebd8207e06..46f8033b24f 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -23,8 +23,11 @@ #define DAMAGE_RATE_LIMIT 3 //damage rate cap at power = 300, scales linearly with power -//These would be what you would get at point blank, decreases with distance -#define DETONATION_RADS 200 +// Base variants are applied to everyone on the same Z level +// Range variants are applied on per-range basis: numbers here are on point blank, it scales with the map size (assumes square shaped Z levels) +#define DETONATION_RADS 20 +#define DETONATION_HALLUCINATION_BASE 300 +#define DETONATION_HALLUCINATION_RANGE 300 #define DETONATION_HALLUCINATION 600 @@ -39,6 +42,7 @@ anchored = 0 light_range = 4 + rad_power = 1 //So it gets added to the repository var/gasefficency = 0.25 var/base_icon_state = "darkmatter" @@ -95,6 +99,10 @@ anchored = 1 grav_pulling = 1 exploded = 1 + var/turf/TS = get_turf(src) // The turf supermatter is on. SM being in a locker, mecha, or other container shouldn't block it's effects that way. + radiation_repository.z_radiate(TS, DETONATION_RADS) + radiation_repository.z_radiate(TS, DETONATION_RADS) + for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) if(T && (loc.z == T.z)) @@ -102,8 +110,6 @@ //Hilariously enough, running into a closet should make you get hit the hardest. var/mob/living/carbon/human/H = mob H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) - var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) - mob.apply_effect(rads, IRRADIATE) spawn(pull_time) explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) qdel(src) @@ -258,12 +264,15 @@ if(eye_shield < 1) l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) ) +/* //adjusted range so that a power of 170 (pretty high) results in 9 tiles, roughly the distance from the core to the engine monitoring room. //note that the rads given at the maximum range is a constant 0.2 - as power increases the maximum range merely increases. for(var/mob/living/l in range(src, round(sqrt(power / 2)))) var/radius = max(get_dist(l, src), 1) var/rads = (power / 10) * ( 1 / (radius**2) ) l.apply_effect(rads, IRRADIATE) +*/ + rad_power = power * 1.5//Better close those shutters! power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation @@ -377,8 +386,8 @@ "The unearthly ringing subsides and you notice you have new radiation burns.", 2) else l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) - var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) ) - l.apply_effect(rads, IRRADIATE) + var/rads = 500 + radiation_repository.radiate(src, rads) /obj/machinery/power/supermatter/proc/supermatter_pull() @@ -394,6 +403,7 @@ return + /obj/machinery/power/supermatter/GotoAirflowDest(n) //Supermatter not pushed around by airflow return diff --git a/code/modules/xenoarcheaology/effects/radiate.dm b/code/modules/xenoarcheaology/effects/radiate.dm index 78164097573..6c8d37838a7 100644 --- a/code/modules/xenoarcheaology/effects/radiate.dm +++ b/code/modules/xenoarcheaology/effects/radiate.dm @@ -15,16 +15,10 @@ /datum/artifact_effect/radiate/DoEffectAura() if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/M in range(src.effectrange,T)) - M.apply_effect(radiation_amount,IRRADIATE,0) - M.updatehealth() + radiation_repository.flat_radiate(holder, radiation_amount, src.effectrange) return 1 /datum/artifact_effect/radiate/DoEffectPulse() if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/M in range(src.effectrange,T)) - M.apply_effect(radiation_amount * 25,IRRADIATE,0) - M.updatehealth() + radiation_repository.radiate(holder, ((radiation_amount * 25) * (sqrt(src.effectrange)))) //Need to get feedback on this return 1 diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index 9d6450a839b..9e3343b6802 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -198,8 +198,7 @@ radiation = rand() * 15 + 85 if(!rad_shield) //irradiate nearby mobs - for(var/mob/living/M in view(7,src)) - M.apply_effect(radiation / 25, IRRADIATE, 0) + radiation_repository.radiate(src, radiation / 25) else t_left_radspike = pick(10,15,25) @@ -361,4 +360,4 @@ scanned_item = null add_fingerprint(usr) - return 1 // update UIs attached to this object + return 1 // update UIs attached to this object \ No newline at end of file diff --git a/html/changelogs/cirra-Radiation.yml b/html/changelogs/cirra-Radiation.yml new file mode 100644 index 00000000000..53038532cde --- /dev/null +++ b/html/changelogs/cirra-Radiation.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Cirra + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added a unified radiation system. Radiation is lessened by obstacles, and distance." + - rscadd: "Added a geiger counter for measuring radiation levels, which can be found in certain vending machines and radiation closets." diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 336f8dfe9ca6529e358c535cf800995662f80912..1198dc0314405b17131745daabc112e319559d67 100644 GIT binary patch literal 55614 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 z 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 literal 51528 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üT&6RojtjKxL?!)u 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 Date: Mon, 22 May 2017 16:26:24 +0100 Subject: [PATCH 03/10] Tweaks readstorms as per Bay --- code/modules/events/radiation_storm.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index a8c9386fde2..1debfb2fcfe 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -2,7 +2,7 @@ var/const/enterBelt = 30 var/const/radIntervall = 5 // Enough time between enter/leave belt for 10 hits, as per original implementation var/const/leaveBelt = 80 - var/const/revokeAccess = 135 + var/const/revokeAccess = 165 startWhen = 2 announceWhen = 1 endWhen = revokeAccess @@ -27,8 +27,7 @@ radiate() else if(activeFor == leaveBelt) - command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") - + command_announcement.Announce("The station has passed the radiation belt. Please allow for up to one minute while radiation levels dissipate, and report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") /datum/event/radiation_storm/proc/radiate() var/radiation_level = rand(15, 35) for(var/z in using_map.station_levels) From 40ba4f5913292dc382540def4c63192075004748 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 16:29:04 +0100 Subject: [PATCH 04/10] Fixes a radiation oversight as per Bay --- code/modules/events/radiation_storm.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 1debfb2fcfe..4596e9ef351 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -37,7 +37,8 @@ var/area/A = get_area(C) if(!A) continue - + if(A.flags & AREA_RAD_SHIELDED) + continue if(istype(C,/mob/living/carbon/human)) var/mob/living/carbon/human/H = C if(prob(5)) From e5ebd3a56d781def2f789d4c966249805a4140cf Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 16:33:37 +0100 Subject: [PATCH 05/10] Fixes a radiation oversight --- code/modules/events/radiation_storm.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index 4596e9ef351..bf2dec5e4e5 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -37,7 +37,7 @@ var/area/A = get_area(C) if(!A) continue - if(A.flags & AREA_RAD_SHIELDED) + if(A.flags & RAD_SHIELDED) continue if(istype(C,/mob/living/carbon/human)) var/mob/living/carbon/human/H = C From 4dd0bb9bbebc989c63cba8068c8fd4c9a1d043ef Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 16:46:25 +0100 Subject: [PATCH 06/10] Fixes SM stuff --- code/modules/supermatter/supermatter.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 46f8033b24f..9db6eca0ad0 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -100,9 +100,10 @@ grav_pulling = 1 exploded = 1 var/turf/TS = get_turf(src) // The turf supermatter is on. SM being in a locker, mecha, or other container shouldn't block it's effects that way. - radiation_repository.z_radiate(TS, DETONATION_RADS) - radiation_repository.z_radiate(TS, DETONATION_RADS) - + if(!TS) + return + for(var/z in GetConnectedZlevels(TS.z)) + radiation_repository.z_radiate(locate(1, 1, z), DETONATION_RADS, 1) for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) if(T && (loc.z == T.z)) @@ -111,7 +112,7 @@ var/mob/living/carbon/human/H = mob H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) spawn(pull_time) - explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) + explosion(TS, explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) qdel(src) return @@ -389,7 +390,6 @@ var/rads = 500 radiation_repository.radiate(src, rads) - /obj/machinery/power/supermatter/proc/supermatter_pull() //following is adapted from singulo code if(defer_powernet_rebuild != 2) From 341be4ccb8f0a71e2cc05e8e1fb3d6c12e8a35cb Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 16:48:52 +0100 Subject: [PATCH 07/10] Max health thing --- code/game/objects/items/devices/scanners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 6399d0ce4a7..3d48a403749 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -69,7 +69,7 @@ REAGENT SCANNER user.show_message("Analyzing Results for [M]:") user.show_message("Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health*100/M.maxHealth)]% healthy"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health*100/M.getMaxHealth())]% healthy"]") user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) From b1250a4391ba446d68e8d61af3836796fdccff55 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 22 May 2017 17:17:28 +0100 Subject: [PATCH 08/10] Door stuff --- code/game/objects/structures/simple_doors.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 58742c3b609..4e302e0e317 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -168,8 +168,7 @@ /obj/structure/simple_door/process() if(!material.radioactivity) return - for(var/mob/living/L in range(1,src)) - L.apply_effect(round(material.radioactivity/3),IRRADIATE,0) + radiation_repository.radiate(src, round(material.radioactivity/3)) /obj/structure/simple_door/iron/New(var/newloc,var/material_name) ..(newloc, "iron") From 34c73dab6963c91086f30a1bc1ad6a79038e766e Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 24 May 2017 16:37:06 -0400 Subject: [PATCH 09/10] Optimization/Rewrite of Radiation Controller * The performance of the radiation controller as-is was not fast enough for inclusion in production servers, but it has some nice featuers, so rewrote it to be more performant. * Instead of storing the radiation strength for every turf, we only store the sources of radiation, and calculate the strength only for mobs who might be in range. * Old method was ray-tracing to every turf in range whether anything was there to be irradiated or not. Could be hundreds of turfs. New method only lazily calcualtes strength at a turf if we actually need to know it. Often times this is zero turfs if nobody is standing in engineering. * Removed the automatic processing of objects with "rad_power" set. Objects are responsible for calling the repository to create/update their radiation sources. Saves some extra overhead that in practice was redundant with other process controllers. * Also tweaked to be more respectful of qdel'd objects and added some comments. --- code/controllers/Processes/radiation.dm | 68 ++++---- code/datums/repositories/radiation.dm | 178 +++++++++++--------- code/game/atoms_movable.dm | 3 - code/game/machinery/doors/airlock.dm | 9 +- code/game/machinery/doors/blast_door.dm | 3 +- code/game/machinery/doors/door.dm | 3 +- code/game/objects/items/devices/geiger.dm | 2 +- code/game/objects/items/devices/scanners.dm | 6 +- code/game/turfs/simulated/wall_attacks.dm | 2 +- code/game/turfs/simulated/wall_icon.dm | 2 +- code/game/turfs/turf.dm | 11 +- code/modules/events/event_container.dm | 2 +- code/modules/events/solar_storm.dm | 17 +- code/modules/mining/mine_turfs.dm | 2 +- code/modules/power/singularity/collector.dm | 8 +- code/modules/supermatter/supermatter.dm | 6 +- 16 files changed, 172 insertions(+), 150 deletions(-) diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm index 8ebd3a71a8e..e64f71ebb7d 100644 --- a/code/controllers/Processes/radiation.dm +++ b/code/controllers/Processes/radiation.dm @@ -7,37 +7,43 @@ linked = radiation_repository /datum/controller/process/radiation/doWork() -// set background = 1 - for(var/turf/T in linked.irradiated_turfs) - if(!T) - linked.irradiated_turfs.Remove(T) + // Step 1 - Sources Decay + var/list/sources = linked.sources + for(var/thing in sources) + if(deleted(thing)) + sources.Remove(thing) continue - linked.irradiated_turfs[T] -= config.radiation_decay_rate - if(linked.irradiated_turfs[T] <= config.radiation_lower_limit) - linked.irradiated_turfs.Remove(T) - SCHECK - for(var/mob/living/L in linked.irradiated_mobs) - if(!L) - linked.irradiated_mobs.Remove(L) - continue - if(get_turf(L) in linked.irradiated_turfs) - L.rad_act(linked.irradiated_turfs[get_turf(L)]) - if(!L.radiation) - linked.irradiated_mobs.Remove(L) - SCHECK - for(var/thing in linked.sources) - if(!thing) - linked.sources.Remove(thing) - continue - var/atom/emitter = thing - linked.radiate(emitter, emitter.rad_power) - to_process.Cut() - SCHECK - for(var/thing in linked.resistance_cache) - if(!thing) - linked.resistance_cache.Remove(thing) + var/datum/radiation_source/S = thing + if(S.decay) + S.update_rad_power(S.rad_power - config.radiation_decay_rate) + if(S.rad_power <= config.radiation_lower_limit) + sources.Remove(S) + SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case. + + // Step 2 - Cache Expires + var/list/resistance_cache = linked.resistance_cache + for(var/thing in resistance_cache) + if(deleted(thing)) + resistance_cache.Remove(thing) continue var/turf/T = thing - if((length(T.contents) + 1) != linked.resistance_cache[T]) - T.calc_rad_resistance() - SCHECK \ No newline at end of file + if((length(T.contents) + 1) != resistance_cache[T]) + resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed. + SCHECK + + // Step 3 - Registered irradiatable things are checked for radiation + var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway. + if(length(linked.sources) > 0) + for(var/thing in registered_listeners) + if(deleted(thing)) + continue + var/atom/A = thing + var/turf/T = get_turf(thing) + var/rads = linked.get_rads_at_turf(T) + if(rads) + A.rad_act(rads) + SCHECK + +/datum/controller/process/radiation/statProcess() + ..() + stat(null, "[linked.sources.len] sources, [linked.resistance_cache.len] cached turfs") diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index bdf2b183226..457e423b4eb 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -1,114 +1,132 @@ -//#define RADDBG - -var/repository/radiation/radiation_repository = new() - -var/list/to_process = list() +var/global/repository/radiation/radiation_repository = new() /repository/radiation - var/list/sources = list() //All the radiation sources we know about - var/list/irradiated_turfs = list() - var/list/irradiated_mobs = list() - var/list/resistance_cache = list() + 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. -/repository/radiation/proc/report_rads(var/turf/T as turf) - return irradiated_turfs[T] +// 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 + var/turf/source_turf // Location of the radiation source. + var/rad_power // Strength of the radiation being emitted. + var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter) + var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas. + var/flat = FALSE // True for power falloff with distance. + var/range // Cached maximum range, used for quick checks against mobs. +/datum/radiation_source/Destroy() + radiation_repository.sources -= src + if(radiation_repository.sources_assoc[src.source_turf] == src) + radiation_repository.sources -= src.source_turf + . = ..() + +/datum/radiation_source/proc/update_rad_power(var/new_power = null) + if(new_power != null && new_power != rad_power) + rad_power = new_power + . = 1 + if(. && !flat) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) + +// Ray trace from all active radiation sources to T and return the strongest effect. +/repository/radiation/proc/get_rads_at_turf(var/turf/T) + if(!istype(T)) return 0 + + . = 0 + for(var/value in sources) + var/datum/radiation_source/source = value + if(source.rad_power < .) + continue // Already being affected by a stronger source + var/dist = get_dist(source.source_turf, T) + if(dist > source.range) + continue // Too far to possibly affect + if(source.respect_maint) + var/atom/A = T.loc + if(A.flags & RAD_SHIELDED) + continue // In shielded area + if(source.flat) + . = max(., 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(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. + origin.calc_rad_resistance() + working = max((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0) + if(working <= .) + break // Already affected by a stronger source (or its zero...) + . = max((working * (1 / (dist ** 2))), .) //Butchered version of the inverse square law. Works for this purpose + +// Add a radiation source instance to the repository. It will override any existing source on the same turf. +/repository/radiation/proc/add_source(var/datum/radiation_source/S) + 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 /repository/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) + return S - var/range = min(round(sqrt(power / config.radiation_lower_limit)), 31) - var/turf/epicentre = get_turf(source) - to_process = list() - - range = min(epicentre.x, world.maxx - epicentre.x, epicentre.y, world.maxy - epicentre.y, range) - - to_process = trange(range, epicentre) - to_process[epicentre] = power - - for(var/turf/spot in to_process) - var/turf/origin = get_turf(epicentre) - var/working = power - while(origin != spot) - origin = get_step_towards(origin, spot) //Raytracing - if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. - origin.calc_rad_resistance() - working = max((working - (origin.rad_resistance * config.radiation_resistance_multiplier)), 0) - if(!working) - break - if(!to_process[origin]) - to_process[origin] = working - - else - to_process[origin] = max(to_process[origin], working) - - for(var/turf/spot in to_process) - irradiated_turfs[spot] = max(((to_process[spot]) * (1 / (get_dist(epicentre, spot) ** 2))), irradiated_turfs[spot]) //Butchered version of the inverse square law. Works for this purpose - #ifdef RADDBG - var/x = Clamp( irradiated_turfs[spot], 0, 255) - spot.color = rgb(5,x,5) - #endif - -/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint=0) //Sets the radiation in a range to a constant value. +// Sets the radiation in a range to a constant value. +/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = FALSE) if(!(source && power && range)) return - var/turf/epicentre = get_turf(source) - range = min(epicentre.x, world.maxx - epicentre.x, epicentre.y, world.maxy - epicentre.y, range) - if(!respect_maint) - for(var/turf/T in trange(range, epicentre)) - irradiated_turfs[T] = max(power, irradiated_turfs[T]) - else - for(var/turf/T in trange(range, epicentre)) - var/area/A = T.loc - if(A.flags & RAD_SHIELDED) - continue - irradiated_turfs[T] = max(power, irradiated_turfs[T]) + 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) + return S -/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint=0) //Irradiates a full Z-level. Hacky way of doing it, but not too expensive. +// Irradiates a full Z-level. Hacky way of doing it, but not too expensive. +/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = FALSE) 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) +/turf + var/cached_rad_resistance = 0 + /turf/proc/calc_rad_resistance() - rad_resistance = 0 + cached_rad_resistance = 0 for(var/obj/O in src.contents) if(O.rad_resistance) //Override - rad_resistance += O.rad_resistance + cached_rad_resistance += O.rad_resistance - else if(O.density) //So doors don't get counted + else if(O.density) //So open doors don't get counted var/material/M = O.get_material() if(!M) continue - rad_resistance += M.weight + cached_rad_resistance += M.weight + // 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 radiation_repository.resistance_cache[src] = (length(contents) + 1) /turf/simulated/wall/calc_rad_resistance() radiation_repository.resistance_cache[src] = (length(contents) + 1) - rad_resistance = (density ? material.weight : 0) + cached_rad_resistance = (density ? material.weight : 0) -/atom - var/rad_power = 0 - var/rad_resistance = 0 +/obj + var/rad_resistance = 0 // Allow overriding rad resistance -/atom/Destroy() - if(rad_power) - radiation_repository.sources.Remove(src) - . = ..() - -/atom/proc/update_radiation() //For VV'ing something to make it radioactive at runtime - if((rad_power) && (!(src in radiation_repository.sources))) - radiation_repository.sources.Add(src) - else if((!rad_power) && (src in radiation_repository.sources)) - radiation_repository.sources.Remove(src) - -/atom/proc/rad_act(var/severity) //If people expand the system, this may be useful. Here as a placeholder until then +// If people expand the system, this may be useful. Here as a placeholder until then +/atom/proc/rad_act(var/severity) return 1 /mob/living/rad_act(var/severity) if(severity) src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) - for(var/obj/I in src) + for(var/atom/I in src) I.rad_act(severity) - - -//#undef RADDBG \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 82061ddb6ad..fe9f99b0328 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -53,9 +53,6 @@ pulledby = null /atom/movable/proc/initialize() - if(rad_power) - radiation_repository.sources.Add(src) - if(!isnull(gcDestroyed)) crash_with("GC: -- [type] had initialize() called after qdel() --") diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index c1ec9287b0e..5d8d068d49d 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -263,7 +263,7 @@ icon = 'icons/obj/doors/Dooruranium.dmi' mineral = "uranium" var/last_event = 0 - rad_power = 7.5 + var/rad_power = 7.5 /obj/machinery/door/airlock/process() // Deliberate no call to parent. @@ -278,6 +278,13 @@ ..() +/obj/machinery/door/airlock/uranium/process() + if(world.time > last_event+20) + if(prob(50)) + radiation_repository.radiate(src, rad_power) + last_event = world.time + ..() + /obj/machinery/door/airlock/phoron name = "Phoron Airlock" desc = "No way this can end badly." diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index f8e1d1cbb59..41680d3de76 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -53,8 +53,7 @@ icon_state = icon_state_closed else icon_state = icon_state_open - var/turf/T = get_turf(src) - T.calc_rad_resistance() + radiation_repository.resistance_cache.Remove(get_turf(src)) return // Proc: force_open() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 898683192ff..cf7f96d52da 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -362,8 +362,7 @@ icon_state = "door1" else icon_state = "door0" - var/turf/T = get_turf(src) - T.calc_rad_resistance() + radiation_repository.resistance_cache.Remove(get_turf(src)) return diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index acd85b730c5..62cb9d9862c 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -22,7 +22,7 @@ /obj/item/device/geiger/process() if(!scanning) return - radiation_count = radiation_repository.report_rads(get_turf(src)) + radiation_count = radiation_repository.get_rads_at_turf(get_turf(src)) update_icon() /obj/item/device/geiger/examine(mob/user) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 3d48a403749..cfd0693b15d 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -69,7 +69,7 @@ REAGENT SCANNER user.show_message("Analyzing Results for [M]:") user.show_message("Overall Status: dead") else - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round(M.health*100/M.getMaxHealth())]% healthy"]") + user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.getMaxHealth())*100) ]% healthy"]") user.show_message(" Key: Suffocation/Toxin/Burns/Brute", 1) user.show_message(" Damage Specifics: [OX] - [TX] - [BU] - [BR]") user.show_message("Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) @@ -100,9 +100,7 @@ REAGENT SCANNER OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") if(M.radiation) - user.show_message("Radiation Level: [M.radiation]") - else - user.show_message("No radiation detected.") + user.show_message("Radiation detected.") if(istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M if(C.reagents.total_volume) diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index b236e4dc904..890574d6641 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -7,7 +7,7 @@ if(can_open == WALL_OPENING) return - calc_rad_resistance() + radiation_repository.resistance_cache.Remove(src) if(density) can_open = WALL_OPENING diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index 757639e1bba..eab99bfba72 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -26,7 +26,7 @@ else if(material.opacity < 0.5 && opacity) set_light(0) - calc_rad_resistance() + radiation_repository.resistance_cache.Remove(src) update_connections(1) update_icon() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 87b4b2b6486..3f2e0064f22 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -140,12 +140,6 @@ var/const/enterloopsanity = 100 if(ismob(A)) var/mob/M = A - var/mob/living/L = A - if(istype(L)) - if(!(L in radiation_repository.irradiated_mobs)) - if(src in radiation_repository.irradiated_turfs) - radiation_repository.irradiated_mobs.Add(L) - L.handle_footstep(src) if(!M.lastarea) M.lastarea = get_area(M.loc) if(M.lastarea.has_gravity == 0) @@ -153,6 +147,9 @@ var/const/enterloopsanity = 100 else if(!is_space()) M.inertia_dir = 0 M.make_floating(0) + if(isliving(M)) + var/mob/living/L = M + L.handle_footstep(src) ..() var/objects = 0 if(A && (A.flags & PROXMOVE)) @@ -258,4 +255,4 @@ var/const/enterloopsanity = 100 step(AM, turn(AM.last_move, 180)) if(isliving(AM)) var/mob/living/M = AM - M.turf_collision(src, speed) \ No newline at end of file + M.turf_collision(src, speed) diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 804d13404dc..37a576a4420 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -186,4 +186,4 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT #undef ASSIGNMENT_JANITOR #undef ASSIGNMENT_MEDICAL #undef ASSIGNMENT_SCIENTIST -#undef ASSIGNMENT_SECURITY \ No newline at end of file +#undef ASSIGNMENT_SECURITY diff --git a/code/modules/events/solar_storm.dm b/code/modules/events/solar_storm.dm index 4ebfc71d555..afaa01ed95a 100644 --- a/code/modules/events/solar_storm.dm +++ b/code/modules/events/solar_storm.dm @@ -27,14 +27,17 @@ radiate() /datum/event/solar_storm/proc/radiate() - var/radiation_level = rand(15, 30) - for(var/area/A in all_areas) - if(!(A.z in using_map.player_levels)) + // Note: Too complicated to be worth trying to use the radiation system for this. Its only in space anyway, so we make an exception in this case. + for(var/mob/living/L in living_mob_list) + var/turf/T = get_turf(L) + if(!T) continue - for(var/turf/T in A) - if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) - continue - radiation_repository.irradiated_turfs[T] = radiation_level + + if(!istype(T.loc,/area/space) && !istype(T,/turf/space)) //Make sure you're in a space area or on a space turf + continue + + //Todo: Apply some burn damage from the heat of the sun. Until then, enjoy some moderate radiation. + L.rad_act(rand(15, 30)) /datum/event/solar_storm/end() command_announcement.Announce("The solar storm has passed the station. It is now safe to resume EVA activities. Please report to medbay if you experience any unusual symptoms. ", "Anomaly Alert") diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 68363fb27fa..a6a857c43b8 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -559,4 +559,4 @@ var/list/mining_overlay_cache = list() if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] UpdateMineral() - update_icon() \ No newline at end of file + update_icon() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index ba817d392a0..47a9c08923e 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -31,10 +31,10 @@ var/global/list/rad_collectors = list() last_power_new = 0 - var/turf/T = get_turf(src) - if(T in radiation_repository.irradiated_turfs) - receive_pulse((radiation_repository.irradiated_turfs[T] * 5)) //Maths is hard - + if(P && active) + var/rads = radiation_repository.get_rads_at_turf(get_turf(src)) + if(rads) + receive_pulse(rads * 5) //Maths is hard if(P) if(P.air_contents.gas["phoron"] == 0) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 9db6eca0ad0..046c315ec98 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -42,7 +42,6 @@ anchored = 0 light_range = 4 - rad_power = 1 //So it gets added to the repository var/gasefficency = 0.25 var/base_icon_state = "darkmatter" @@ -112,7 +111,7 @@ var/mob/living/carbon/human/H = mob H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) spawn(pull_time) - explosion(TS, explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) + explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) qdel(src) return @@ -273,7 +272,7 @@ var/rads = (power / 10) * ( 1 / (radius**2) ) l.apply_effect(rads, IRRADIATE) */ - rad_power = power * 1.5//Better close those shutters! + radiation_repository.radiate(src, power * 1.5) //Better close those shutters! power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation @@ -403,7 +402,6 @@ return - /obj/machinery/power/supermatter/GotoAirflowDest(n) //Supermatter not pushed around by airflow return From 2c8df87899c35a0fde9b3f5ba796c48bc672fc25 Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 30 May 2017 12:45:21 -0400 Subject: [PATCH 10/10] Tweak to Radiation Optimization * Optimized garbage collection of radiation sources until we get qdel() hints. * Made the RADIATION_LOWER_LIMIT configurable (option for people to save some cpu time) * Added some comments and broke the proccessor into separate procs for profiling purposes * Added a changelog. --- code/controllers/Processes/radiation.dm | 11 +++++++++-- code/controllers/configuration.dm | 3 +++ code/datums/repositories/radiation.dm | 13 ++++++++++--- config/example/config.txt | 3 +++ html/changelogs/Leshana-Radiation.yml | 5 +++++ 5 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 html/changelogs/Leshana-Radiation.yml diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm index e64f71ebb7d..192acf5d5cb 100644 --- a/code/controllers/Processes/radiation.dm +++ b/code/controllers/Processes/radiation.dm @@ -7,7 +7,12 @@ linked = radiation_repository /datum/controller/process/radiation/doWork() - // Step 1 - Sources Decay + sources_decay() + cache_expires() + irradiate_targets() + +// Step 1 - Sources Decay +/datum/controller/process/radiation/proc/sources_decay() var/list/sources = linked.sources for(var/thing in sources) if(deleted(thing)) @@ -20,7 +25,8 @@ sources.Remove(S) SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case. - // Step 2 - Cache Expires +// Step 2 - Cache Expires +/datum/controller/process/radiation/proc/cache_expires() var/list/resistance_cache = linked.resistance_cache for(var/thing in resistance_cache) if(deleted(thing)) @@ -32,6 +38,7 @@ SCHECK // Step 3 - Registered irradiatable things are checked for radiation +/datum/controller/process/radiation/proc/irradiate_targets() var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway. if(length(linked.sources) > 0) for(var/thing in registered_listeners) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index c22ac1bc81f..51fc286928c 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -720,6 +720,9 @@ var/list/gamemode_cache = list() if(values.len > 0) language_prefixes = values + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index 457e423b4eb..54712820269 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -19,14 +19,23 @@ var/global/repository/radiation/radiation_repository = new() radiation_repository.sources -= src if(radiation_repository.sources_assoc[src.source_turf] == src) radiation_repository.sources -= src.source_turf + src.source_turf = null . = ..() +// TEMPORARY HACK - hard del()'ing sources is too expensive! Until we implement qdel() hints we need to override behavior here +/datum/radiation_source/finalize_qdel() + if(garbage_collector) + garbage_collector.AddTrash(src) + else + delayed_garbage |= src +// TEMPORARY HACK END + /datum/radiation_source/proc/update_rad_power(var/new_power = null) if(new_power != null && new_power != rad_power) rad_power = new_power . = 1 if(. && !flat) - range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist // Ray trace from all active radiation sources to T and return the strongest effect. /repository/radiation/proc/get_rads_at_turf(var/turf/T) @@ -76,7 +85,6 @@ var/global/repository/radiation/radiation_repository = new() S.source_turf = get_turf(source) S.update_rad_power(power) add_source(S) - return S // Sets the radiation in a range to a constant value. /repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = FALSE) @@ -89,7 +97,6 @@ var/global/repository/radiation/radiation_repository = new() S.source_turf = get_turf(source) S.update_rad_power(power) add_source(S) - return S // Irradiates a full Z-level. Hacky way of doing it, but not too expensive. /repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = FALSE) diff --git a/config/example/config.txt b/config/example/config.txt index 232d3c66ad1..52892bc14a3 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -36,6 +36,9 @@ JOBS_HAVE_MINIMAL_ACCESS Configure how fast explosion strength diminishes when travelling up/down z levels. All explosion distances are multiplied by this each time they go up/down z-levels. #MULTI_Z_EXPLOSION_SCALAR 0.5 +# Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT +# RADIATION_LOWER_LIMIT 0.35 + ## log OOC channel LOG_OOC diff --git a/html/changelogs/Leshana-Radiation.yml b/html/changelogs/Leshana-Radiation.yml new file mode 100644 index 00000000000..d4d9c3589d7 --- /dev/null +++ b/html/changelogs/Leshana-Radiation.yml @@ -0,0 +1,5 @@ +author: Leshana +delete-after: True +changes: + - tweak: "Optimized the unified radiation system. Made the radiation cutoff level configurable." + - bugfix: "Standing still won't save you from radiation storms."