mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-19 14:51:27 +00:00
* The fix * Contraaaaaa * Fixes CI * Fixes the pads + cases * Uplink datums * Update code/datums/mind.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> * Update code/__HELPERS/unsorted.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/research/designs/medical_designs.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/research/designs/medical_designs.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/research/designs/medical_designs.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/research/designs/medical_designs.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/surgery/implant_removal.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Outfits now use a proper variable name * Fixes surgery (oops) * More .dme changes * Renames the folder * Fixes bad merge * Contra review * Update code/game/objects/items/weapons/dice.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Fixes CI fail --------- Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com>
140 lines
4.3 KiB
Plaintext
140 lines
4.3 KiB
Plaintext
/datum/radiation_wave
|
|
/// The thing that spawned this radiation wave
|
|
var/source
|
|
/// The center of the wave
|
|
var/turf/master_turf
|
|
/// How far we've moved
|
|
var/steps = 0
|
|
/// How strong it was originaly
|
|
var/intensity
|
|
/// How much contaminated material it still has
|
|
var/remaining_contam
|
|
/// Higher than 1 makes it drop off faster, 0.5 makes it drop off half etc
|
|
var/range_modifier
|
|
/// The direction of movement
|
|
var/move_dir
|
|
/// The directions to the side of the wave, stored for easy looping
|
|
var/list/__dirs
|
|
/// Whether or not this radiation wave can create contaminated objects
|
|
var/can_contaminate
|
|
|
|
/datum/radiation_wave/New(atom/_source, dir, _intensity = 0, _range_modifier = RAD_DISTANCE_COEFFICIENT, _can_contaminate = TRUE)
|
|
|
|
source = "[_source] \[[_source.UID()]\]"
|
|
|
|
master_turf = get_turf(_source)
|
|
|
|
move_dir = dir
|
|
__dirs = list()
|
|
__dirs += turn(dir, 90)
|
|
__dirs += turn(dir, -90)
|
|
|
|
intensity = _intensity
|
|
remaining_contam = intensity
|
|
range_modifier = _range_modifier
|
|
can_contaminate = _can_contaminate
|
|
|
|
START_PROCESSING(SSradiation, src)
|
|
|
|
/datum/radiation_wave/Destroy()
|
|
. = QDEL_HINT_IWILLGC
|
|
STOP_PROCESSING(SSradiation, src)
|
|
..()
|
|
|
|
/datum/radiation_wave/process()
|
|
master_turf = get_step(master_turf, move_dir)
|
|
if(!master_turf)
|
|
qdel(src)
|
|
return
|
|
steps++
|
|
var/list/atoms = get_rad_atoms()
|
|
|
|
var/strength
|
|
if(steps > 1)
|
|
strength = INVERSE_SQUARE(intensity, max(range_modifier * steps, 1), 1)
|
|
else
|
|
strength = intensity
|
|
|
|
if(strength < RAD_BACKGROUND_RADIATION)
|
|
qdel(src)
|
|
return
|
|
radiate(atoms, strength)
|
|
check_obstructions(atoms) // reduce our overall strength if there are radiation insulators
|
|
|
|
/datum/radiation_wave/proc/get_rad_atoms()
|
|
var/list/atoms = list()
|
|
var/distance = steps
|
|
var/cmove_dir = move_dir
|
|
var/cmaster_turf = master_turf
|
|
|
|
if(cmove_dir == NORTH || cmove_dir == SOUTH)
|
|
distance-- //otherwise corners overlap
|
|
|
|
atoms += get_rad_contents(cmaster_turf)
|
|
|
|
var/turf/place
|
|
for(var/dir in __dirs) //There should be just 2 dirs in here, left and right of the direction of movement
|
|
place = cmaster_turf
|
|
for(var/i in 1 to distance)
|
|
place = get_step(place, dir)
|
|
if(!place)
|
|
break
|
|
atoms += get_rad_contents(place)
|
|
|
|
return atoms
|
|
|
|
/datum/radiation_wave/proc/check_obstructions(list/atoms)
|
|
var/width = steps
|
|
var/cmove_dir = move_dir
|
|
if(cmove_dir == NORTH || cmove_dir == SOUTH)
|
|
width--
|
|
width = 1 + (2 * width)
|
|
|
|
for(var/k in 1 to atoms.len)
|
|
var/atom/thing = atoms[k]
|
|
if(!thing)
|
|
continue
|
|
if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_WAVE_PASSING, src, width) & COMPONENT_RAD_WAVE_HANDLED)
|
|
continue
|
|
if(thing.rad_insulation != RAD_NO_INSULATION)
|
|
intensity *= (1 - ((1 - thing.rad_insulation) / width))
|
|
|
|
/datum/radiation_wave/proc/radiate(list/atoms, strength)
|
|
var/can_contam = strength >= RAD_MINIMUM_CONTAMINATION
|
|
var/contamination_strength = (strength - RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT
|
|
contamination_strength = max(contamination_strength, RAD_BACKGROUND_RADIATION)
|
|
// It'll never reach 100% chance but the further out it gets the more likely it'll contaminate
|
|
var/contamination_chance = 100 - (90 / (1 + steps * 0.1))
|
|
for(var/k in atoms)
|
|
var/atom/thing = k
|
|
if(QDELETED(thing))
|
|
continue
|
|
thing.rad_act(strength)
|
|
|
|
// This list should only be for types which don't get contaminated but you want to look in their contents
|
|
// If you don't want to look in their contents and you don't want to rad_act them:
|
|
// modify the ignored_things list in __HELPERS/radiation.dm instead
|
|
var/static/list/blacklisted = typecacheof(list(
|
|
/turf,
|
|
/obj/structure/cable,
|
|
/obj/machinery/atmospherics,
|
|
/obj/item/ammo_casing,
|
|
/obj/item/bio_chip,
|
|
/obj/singularity,
|
|
))
|
|
if(!can_contaminate || !can_contam || blacklisted[thing.type])
|
|
continue
|
|
if(thing.flags_2 & RAD_NO_CONTAMINATE_2 || SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION)
|
|
continue
|
|
|
|
if(contamination_strength > remaining_contam)
|
|
contamination_strength = remaining_contam
|
|
if(!prob(contamination_chance))
|
|
continue
|
|
if(SEND_SIGNAL(thing, COMSIG_ATOM_RAD_CONTAMINATING, strength) & COMPONENT_BLOCK_CONTAMINATION)
|
|
continue
|
|
remaining_contam -= contamination_strength
|
|
if(remaining_contam < RAD_BACKGROUND_RADIATION)
|
|
can_contaminate = FALSE
|
|
thing.AddComponent(/datum/component/radioactive, contamination_strength, source)
|