mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-29 11:02:05 +00:00
* Radiation. Replaces radiation chance with radiation intensity on radiation pulses. Radiation intensity determines the chance of getting irradiated, and diminishes over range or getting blocked by objects. Getting close to the radioactive source will give you a high chance to get irradiated, while being far but still in range will give you a low chance to get irradiated. * I suck at spelling. Balances some atmos related radiation stuff. Changes supermatter radiation stuff, though I would probably need to adjust the threshold to adjust for the new changes. Calling radiation pulse without intensity parameter filled will now set the intensity to be the value where it will give an object a 5% chance to get irradiated from the max range of the pulse, assuming there are no objects between it that absorb radiation. The same will happen if you call radiation pulse without max range parameter filled. Co-authored-by: Pickle-Coding <58013024+Pickle-Coding@users.noreply.github.com>
77 lines
3.6 KiB
Plaintext
77 lines
3.6 KiB
Plaintext
/// Whether or not it's possible for this atom to be irradiated
|
|
#define CAN_IRRADIATE(atom) (ishuman(##atom) || isitem(##atom))
|
|
|
|
/// Sends out a pulse of radiation, eminating from the source.
|
|
/// Radiation is performed by collecting all radiatables within the max range (0 means source only, 1 means adjacent, etc),
|
|
/// then makes their way towards them. A number, starting at 1, is multiplied
|
|
/// by the insulation amounts of whatever is in the way (for example, walls lowering it down).
|
|
/// If this number hits equal or below the threshold, then the target can no longer be irradiated.
|
|
/// If the number is above the threshold, then the chance is the chance that the target will be irradiated.
|
|
/// As a consumer, this means that max_range going up usually means you want to lower the threshold too,
|
|
/// as well as the other way around.
|
|
/// If max_range is high, but threshold is too high, then it usually won't reach the source at the max range in time.
|
|
/// If max_range is low, but threshold is too low, then it basically guarantees everyone nearby, even if there's walls
|
|
/// and such in the way, can be irradiated.
|
|
/// You can also pass in a minimum exposure time. If this is set, then this radiation pulse
|
|
/// will not irradiate the source unless they have been around *any* radioactive source for that
|
|
/// period of time.
|
|
/// The chance to get irradiated diminishes over range, and from objects that block radiation.
|
|
/// Assuming there is nothing in the way, the chance will determine what the chance is to get irradiated from half of max_range.
|
|
/// Example: If chance is equal to 30%, and max_range is equal to 8,
|
|
/// then the chance for a thing to get irradiated is 30% if they are 4 turfs away from the pulse source.
|
|
/proc/radiation_pulse(
|
|
atom/source,
|
|
max_range,
|
|
threshold,
|
|
chance = DEFAULT_RADIATION_CHANCE,
|
|
minimum_exposure_time = 0,
|
|
)
|
|
if(!SSradiation.can_fire)
|
|
return
|
|
|
|
var/datum/radiation_pulse_information/pulse_information = new
|
|
pulse_information.source_ref = WEAKREF(source)
|
|
pulse_information.max_range = max_range
|
|
pulse_information.threshold = threshold
|
|
pulse_information.chance = chance
|
|
pulse_information.minimum_exposure_time = minimum_exposure_time
|
|
|
|
SSradiation.processing += pulse_information
|
|
|
|
return TRUE
|
|
|
|
/datum/radiation_pulse_information
|
|
var/datum/weakref/source_ref
|
|
var/max_range
|
|
var/threshold
|
|
var/chance
|
|
var/minimum_exposure_time
|
|
|
|
#define MEDIUM_RADIATION_THRESHOLD_RANGE 0.5
|
|
#define EXTREME_RADIATION_CHANCE 30
|
|
|
|
/// Gets the perceived "danger" of radiation pulse, given the threshold to the target.
|
|
/// Returns a RADIATION_DANGER_* define, see [code/__DEFINES/radiation.dm]
|
|
/proc/get_perceived_radiation_danger(datum/radiation_pulse_information/pulse_information, insulation_to_target)
|
|
if (insulation_to_target > pulse_information.threshold)
|
|
// We could get irradiated! The only thing stopping us now is chance, so scale based on that.
|
|
if (pulse_information.chance >= EXTREME_RADIATION_CHANCE)
|
|
return PERCEIVED_RADIATION_DANGER_EXTREME
|
|
else
|
|
return PERCEIVED_RADIATION_DANGER_HIGH
|
|
else
|
|
// We're out of the threshold from being irradiated, but by how much?
|
|
if (insulation_to_target / pulse_information.threshold <= MEDIUM_RADIATION_THRESHOLD_RANGE)
|
|
return PERCEIVED_RADIATION_DANGER_MEDIUM
|
|
else
|
|
return PERCEIVED_RADIATION_DANGER_LOW
|
|
|
|
/// A common proc used to send COMSIG_ATOM_PROPAGATE_RAD_PULSE to adjacent atoms
|
|
/// Only used for uranium (false/tram)walls to spread their radiation pulses
|
|
/atom/proc/propagate_radiation_pulse()
|
|
for(var/atom/atom in orange(1,src))
|
|
SEND_SIGNAL(atom, COMSIG_ATOM_PROPAGATE_RAD_PULSE, src)
|
|
|
|
#undef MEDIUM_RADIATION_THRESHOLD_RANGE
|
|
#undef EXTREME_RADIATION_CHANCE
|