Bomb and Radioactivity Behaviors (#21593)

changes:
- balance: "Dirty bomb cleanable 'greenglow' decal left behind is now
actually radioactive to make it more persistently hazardous."
- balance: "'Radioactive waste' rare Warehouse spawn submap now uses
low-radioactivity variants for some of its contents and also been given
a radioactive gear crate."
- balance: "Adds increased taste_mult values to radioactive waste,
napalm, and nitroglycerin; it should be noticeable if your drink is
spiked with any of them."
- balance: "Both uranium and radioactive waste reagents will create
radioactive pools on the floor if spilled (uranium weak, radioactive
waste medium/strong)."
- balance: "Bombs are now allowed to be planted on any mob type except
for carbons."
- balance: "Increases the numbers of assemblies (signalers, igniters,
etc.) stocked in vending machines."
- rscadd: "Adds a radioactive waste chemical canister to the Uplink (5
tc)."
- code_imp: "Adds additional variants of greenglow/radioactive decal and
radioactive_waste/hazardous obj that are more or less radioactive for
mapping and ST use."
  - code_imp: "Cleans up bomb timer setting code and admin logging."
  - qol: "Adds more examine hints to reagent dispensers."
  - qol: "Adds more examine hints to bombs."
  
The 'radioactive waste chemical canister' item cost was set to 5 tc to
match the other 'hazardous chemical' antag item, the Chlorine Tank.
This commit is contained in:
Batrachophreno
2025-12-19 20:21:10 +00:00
committed by GitHub
parent 1c786f16c6
commit 55045bc606
17 changed files with 286 additions and 115 deletions
@@ -168,7 +168,7 @@
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T)
if(!glow)
new /obj/effect/decal/cleanable/greenglow(T)
new /obj/effect/decal/cleanable/greenglow/radioactive/low(T)
return
/singleton/reagent/radioactive_waste
@@ -177,6 +177,8 @@
reagent_state = SOLID
color = "#E0FF66"
taste_description = "warm, tingly imminent death"
/// It cannot be overstated how bad this tastes.
taste_mult = 20
fallback_specific_heat = 2.286
/singleton/reagent/radioactive_waste/affect_touch(var/mob/living/carbon/M, var/alien, var/removed, var/datum/reagents/holder)
@@ -186,11 +188,14 @@
M.apply_effect(25 * removed, DAMAGE_RADIATION, blocked = 0)
/singleton/reagent/radioactive_waste/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder)
if(amount >= 3)
if(amount >= 5)
if(!istype(T, /turf/space))
var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T)
if(!glow)
new /obj/effect/decal/cleanable/greenglow/radioactive(T)
if(amount >= 10)
new /obj/effect/decal/cleanable/greenglow/radioactive/high(T)
else
new /obj/effect/decal/cleanable/greenglow/radioactive(T)
return
/singleton/reagent/platinum
@@ -314,6 +319,7 @@
color = "#A5F0EE"
touch_met = REM * 10
taste_description = "sourness"
taste_mult = 1.5
germ_adjust = 10
value = 0.7
@@ -485,6 +491,7 @@
reagent_state = LIQUID
color = COLOR_GRAY
taste_description = "oil"
taste_mult = 1.3
value = 9
/singleton/reagent/nitroglycerin/proc/explode(var/datum/reagents/holder)
@@ -649,6 +656,7 @@
color = "#D35908"
touch_met = 50
taste_description = "fiery death"
taste_mult = 20
/singleton/reagent/fuel/napalm/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder)
new /obj/effect/decal/cleanable/liquid_fuel/napalm(T, amount/3)
@@ -344,3 +344,6 @@
/obj/item/reagent_containers/chem_disp_cartridge/sanasomnum
spawn_reagent = /singleton/reagent/sanasomnum
// Antagonist/EXTREMELY UNSAFE
/obj/item/reagent_containers/chem_disp_cartridge/radioactive_waste
spawn_reagent = /singleton/reagent/radioactive_waste
+61 -11
View File
@@ -16,7 +16,9 @@
/obj/structure/reagent_dispensers/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "Use Help intent to fill a container in your hand from this, and use any other intent to empty the container into this."
. += "Right-click this to change the amount transferred per use."
. += "In the right-click menu, you can set the amount transferred per use."
if(can_tamper)
. += "Using a wrench on this with the Harm intent will open or close the faucet; an open faucet will cause it to continuously leak its contents."
/obj/structure/reagent_dispensers/feedback_hints(mob/user, distance, is_adjacent)
. += ..()
@@ -477,28 +479,76 @@
amount_per_transfer_from_this = 300
reagents_to_add = list(/singleton/reagent/radioactive_waste = 1000)
/obj/structure/reagent_dispensers/radioactive_waste/hazardous // Only use this if you want active radiation.
/obj/structure/reagent_dispensers/antagonist_hints(mob/user, distance, is_adjacent)
. += ..()
if(can_tamper)
. += "Using a wrench on this with the Harm intent will open or close the faucet; an open faucet will cause it to continuously leak its contents."
. += "This hint is being repeated for emphasis. MAKING THIS LEAK WILL CAUSE EVERYONE NEARBY TO HAVE A BAD TIME."
/// Only use this if you want active radiation.
ABSTRACT_TYPE(/obj/structure/reagent_dispensers/radioactive_waste/hazardous)
name = "leaking radioactive waste barrel"
desc = "A metal barrel containing radioactive waste; the seals on this one seem to have failed and noxious fumes are escaping."
desc = "A metal barrel containing radioactive waste; the seals on this one seem to have failed and noxious fumes are escaping!"
light_range = 2
light_power = 0.6
light_color = "#64C864"
/// Radiation generated by SSradiation.radiate each process() tick.
var/radioactivity
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/antagonist_hints(mob/user, distance, is_adjacent)
. += ..()
. += "Characters directly adjacent to this object will be exposed to <b>[radioactivity] IU/s</b> of radiation. Radiation falls off (approximately) by 75% for every tile away you move."
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/low
radioactivity = 25
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/low/antagonist_hints(mob/user, distance, is_adjacent)
. += ..()
. += "Geiger counters will start clicking at ~7 tiles away from this object."
. += "Almost all voidsuits, including softsuits, provide sufficient protection to move safely adjacent to it."
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/medium
radioactivity = 50
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/medium/antagonist_hints(mob/user, distance, is_adjacent)
. += "Geiger counters will start clicking at ~9 tiles away from this object."
. += "An engineering voidsuit is necessary to move safely adjacent to it."
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/high
/// This is as high as radsuits can absorb! Use with caution.
radioactivity = 100
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/high/antagonist_hints(mob/user, distance, is_adjacent)
. += "Geiger counters will start clicking at ~11 tiles away from this object."
. += "A radsuit is necessary to move safely adjacent to it."
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/extreme
/// This is higher than radsuits can absorb! Use with caution.
radioactivity = 150
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/extreme/antagonist_hints(mob/user, distance, is_adjacent)
. += "Geiger counters will start clicking at ~13 tiles away from this object."
. += "No living thing can safely stand next to this object! Borgs or IPCs only!"
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/Initialize()
. = ..()
start_process()
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/proc/start_process()
START_PROCESSING(SSprocessing, src)
if(radioactivity)
START_PROCESSING(SSprocessing, src)
/obj/structure/reagent_dispensers/radioactive_waste/hazardous/process()
if(!is_leaking && reagents.total_volume <= 0)
STOP_PROCESSING(SSprocessing,src)
return
else
if(reagents.total_volume > 0)
SSradiation.radiate(src,60)
SSradiation.radiate(src, radioactivity)
if(is_leaking)
var/splash_amount = min(amount_per_transfer_from_this,60) //Hard limit of 60 per process
reagents.trans_to_turf(get_turf(src),splash_amount)
/// The residue probably still isn't very nice.
else
SSradiation.radiate(src, radioactivity / 4)
if(is_leaking && prob(10))
var/splash_amount = min(amount_per_transfer_from_this, rand(2,10))
reagents.trans_to_turf(get_turf(src), splash_amount)
return