mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-01-01 21:13:07 +00:00
* 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.
53 lines
1.7 KiB
Plaintext
53 lines
1.7 KiB
Plaintext
#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.get_rads_at_turf(get_turf(src))
|
|
update_icon()
|
|
|
|
/obj/item/device/geiger/examine(mob/user)
|
|
..(user)
|
|
to_chat(user, "<span class='warning'>[scanning ? "ambient" : "stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.</span>")
|
|
|
|
/obj/item/device/geiger/attack_self(var/mob/user)
|
|
scanning = !scanning
|
|
update_icon()
|
|
to_chat(user, "<span class='notice'>\icon[src] You switch [scanning ? "on" : "off"] [src].</span>")
|
|
|
|
/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 |