diff --git a/_maps/map_files/mining/Lavaland.dmm b/_maps/map_files/mining/Lavaland.dmm
index c38f625319df..d767c11c1ea7 100644
--- a/_maps/map_files/mining/Lavaland.dmm
+++ b/_maps/map_files/mining/Lavaland.dmm
@@ -1514,7 +1514,7 @@
loot = list(/obj/effect/decal/remains/human);
name = "Jim The Door Technician";
wander = 0;
- weather_immunities = list("ash")
+ weather_immunities = 1
},
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/lavaland/surface/outdoors)
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 36362cba857e..b66f798a8194 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -298,10 +298,11 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
#define BULLET_ACT_PENETRATE (1<<4)
// Weather immunities //
-#define WEATHER_STORM "storm"
-#define WEATHER_ACID "acid"
-#define WEATHER_ASH "ash"
-#define WEATHER_LAVA "lava"
-#define WEATHER_RAD "rad"
-#define WEATHER_SNOW "snow"
-#define WEATHER_ALL "all"
+#define WEATHER_LAVA (1<<0)
+#define WEATHER_ACID (1<<1)
+#define WEATHER_ASH (1<<2)
+#define WEATHER_RAD (1<<3)
+#define WEATHER_SNOW (1<<4)
+#define WEATHER_VOIDSTORM (1<<5)
+
+#define WEATHER_STORM (WEATHER_ACID | WEATHER_ASH | WEATHER_RAD | WEATHER_SNOW | WEATHER_VOIDSTORM)
diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm
index 1e3cfb234364..d5ba73a3cbe3 100644
--- a/code/controllers/subsystem/weather.dm
+++ b/code/controllers/subsystem/weather.dm
@@ -30,7 +30,7 @@ SUBSYSTEM_DEF(weather)
var/datum/weather/W = pickweight(possible_weather)
run_weather(W, list(text2num(z)))
eligible_zlevels -= z
- var/randTime = rand(3000, 6000)
+ var/randTime = rand(W.cooldown_lower, W.cooldown_higher)
addtimer(CALLBACK(src, PROC_REF(make_eligible), z, possible_weather), randTime + initial(W.weather_duration_upper), TIMER_UNIQUE) //Around 5-10 minutes between weathers
next_hit_by_zlevel["[z]"] = world.time + randTime + initial(W.telegraph_duration)
diff --git a/code/datums/diseases/advance/symptoms/necropolis.dm b/code/datums/diseases/advance/symptoms/necropolis.dm
index 0d9eb529ba8d..7d6319b02df0 100644
--- a/code/datums/diseases/advance/symptoms/necropolis.dm
+++ b/code/datums/diseases/advance/symptoms/necropolis.dm
@@ -111,6 +111,6 @@
if(fireproof)
REMOVE_TRAIT(H, TRAIT_RESISTHIGHPRESSURE, DISEASE_TRAIT)
REMOVE_TRAIT(H, TRAIT_RESISTHEAT, DISEASE_TRAIT)
- H.weather_immunities -= WEATHER_ASH
- H.weather_immunities -= WEATHER_LAVA
+ H.weather_immunities &= ~WEATHER_ASH
+ H.weather_immunities &= ~WEATHER_LAVA
diff --git a/code/datums/looping_sounds/weather.dm b/code/datums/looping_sounds/weather.dm
index df3f02b80669..5ad32ffda87e 100644
--- a/code/datums/looping_sounds/weather.dm
+++ b/code/datums/looping_sounds/weather.dm
@@ -45,3 +45,35 @@
start_length = 130
end_sound = 'sound/weather/ashstorm/inside/weak_end.ogg'
volume = 20
+
+
+/datum/looping_sound/outside_acid_rain
+ start_sound = 'sound/weather/acidrain/outside/acidrain_outside_start.ogg'
+ start_length = 12 SECONDS
+
+ mid_sounds = list(
+ 'sound/weather/acidrain/outside/acidrain_outside_mid1.ogg'=1,
+ 'sound/weather/acidrain/outside/acidrain_outside_mid2.ogg'=1,
+ 'sound/weather/acidrain/outside/acidrain_outside_mid3.ogg'=1,
+ 'sound/weather/acidrain/outside/acidrain_outside_mid4.ogg'=1
+ )
+ mid_length = 12 SECONDS
+
+ end_sound = 'sound/weather/acidrain/outside/acidrain_outside_end.ogg'
+ volume = 55
+
+/datum/looping_sound/inside_acid_rain
+ start_sound = 'sound/weather/acidrain/inside/acidrain_inside_start.ogg'
+ start_length = 12 SECONDS
+
+ mid_sounds = list(
+ 'sound/weather/acidrain/inside/acidrain_inside_mid1.ogg'=1,
+ 'sound/weather/acidrain/inside/acidrain_inside_mid2.ogg'=1,
+ 'sound/weather/acidrain/inside/acidrain_inside_mid3.ogg'=1,
+ 'sound/weather/acidrain/inside/acidrain_inside_mid4.ogg'=1
+ )
+ mid_length = 12 SECONDS
+
+ end_sound = 'sound/weather/acidrain/inside/acidrain_inside_end.ogg'
+
+ volume = 35 //the audio files are already just a bit quieter than the outside ones, but it should still be notably quieter
diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm
index c1f0bbbd3fa7..7937f586b67f 100644
--- a/code/datums/weather/weather.dm
+++ b/code/datums/weather/weather.dm
@@ -30,6 +30,11 @@
/// Color to apply to the area while weather is occuring
var/weather_color = null
+ /// In deciseconds, how long until the next weather on this Z level once this starts (lower end)
+ var/cooldown_lower = 3000
+ /// In deciseconds, how long until the next weather on this z level once this starts (higher end)
+ var/cooldown_higher = 6000
+
/// Displayed once the weather is over
var/end_message = "The wind relents its assault."
/// In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely
@@ -197,10 +202,10 @@
if(istype(mob_to_check.loc, /obj/structure/closet))
var/obj/structure/closet/current_locker = mob_to_check.loc
if(current_locker.weather_protection)
- if((immunity_type in current_locker.weather_protection) || (WEATHER_ALL in current_locker.weather_protection))
+ if(current_locker.weather_protection & immunity_type)
return
- if((immunity_type in mob_to_check.weather_immunities) || (WEATHER_ALL in mob_to_check.weather_immunities))
+ if(mob_to_check.weather_immunities & immunity_type)
return
if(!(get_area(mob_to_check) in impacted_areas))
diff --git a/code/datums/weather/weather_types/acid_rain.dm b/code/datums/weather/weather_types/acid_rain.dm
index 3fbf458806ba..cea81cd3f566 100644
--- a/code/datums/weather/weather_types/acid_rain.dm
+++ b/code/datums/weather/weather_types/acid_rain.dm
@@ -3,19 +3,24 @@
name = "acid rain"
desc = "The planet's thunderstorms are by nature acidic, and will incinerate anyone standing beneath them without protection."
- telegraph_duration = 400
telegraph_message = span_boldwarning("Thunder rumbles far above. You hear droplets drumming against the canopy. Seek shelter.")
- telegraph_sound = 'sound/ambience/acidrain_start.ogg'
+ telegraph_duration = 30 SECONDS //if you change this i will kill you because the sound file lines up with this
+ telegraph_sound = 'sound/weather/acidrain/acidrain_telegraph.ogg'
weather_message = span_userdanger("Acidic rain pours down around you! Get inside!")
weather_overlay = "acid_rain"
- weather_duration_lower = 600
- weather_duration_upper = 1500
- weather_sound = 'sound/ambience/acidrain_mid.ogg'
+ overlay_plane = HIGHEST_EVER_PLANE + 1 //why does this work, it shouldn't work, this is stupid and i hate it, why is this the ONLY thing that works, why won't it just show up normally, it shows up normally on lavaland, but not on jungleland, i don't understand it doesn't make any sense, this is all wrong
+
+ //lasts shorter
+ weather_duration_lower = 30 SECONDS
+ weather_duration_upper = 180 SECONDS //inconsistent tropical storms
- end_duration = 100
+ //happens slightly more often
+ cooldown_lower = 3 MINUTES
+ cooldown_higher = 5 MINUTES
+
+ end_duration = 20 SECONDS
end_message = span_boldannounce("The downpour gradually slows to a light shower. It should be safe outside now.")
- end_sound = 'sound/ambience/acidrain_end.ogg'
area_type = /area
protect_indoors = TRUE
@@ -23,10 +28,70 @@
immunity_type = WEATHER_ACID // temp
+ probability = 90
+
barometer_predictable = TRUE
+ var/datum/looping_sound/outside_acid_rain/sound_outside = new(list(), FALSE, TRUE)
+ var/datum/looping_sound/inside_acid_rain/sound_inside = new(list(), FALSE, TRUE)
+
+/datum/weather/acid_rain/telegraph()
+ . = ..()
+ var/list/inside_areas = list()
+ var/list/outside_areas = list()
+ var/list/eligible_areas = list()
+ for (var/z in impacted_z_levels)
+ eligible_areas += SSmapping.areas_in_z["[z]"]
+ for(var/i in 1 to eligible_areas.len)
+ var/area/place = eligible_areas[i]
+ if(place.outdoors)
+ outside_areas += place
+ else
+ inside_areas += place
+ CHECK_TICK
+
+ sound_outside.output_atoms = outside_areas
+ sound_inside.output_atoms = inside_areas
+
+/datum/weather/acid_rain/start()
+ . = ..()
+ sound_outside.start()
+ sound_inside.start()
+
+/datum/weather/acid_rain/wind_down()
+ . = ..()
+ sound_outside.stop()
+ sound_inside.stop()
+
+/datum/weather/acid_rain/proc/is_acid_immune(atom/L)
+ while (L && !isturf(L))
+ if(ismecha(L)) //Mechs are immune
+ return TRUE
+ if(isliving(L))// if we're a non immune mob inside an immune mob we have to reconsider if that mob is immune to protect ourselves
+ var/mob/living/the_mob = L
+ var/acid_armour = the_mob.getarmor(null, ACID)
+ if(acid_armour >= 65) //give a bit of wiggle room, this isn't supposed to be that dangerous for someone that's prepared
+ return TRUE
+
+ if(the_mob.weather_immunities & immunity_type)
+ return TRUE
+ if(istype(L, /obj/structure/closet))
+ var/obj/structure/closet/the_locker = L
+ if(the_locker.weather_protection & immunity_type)
+ return TRUE
+ L = L.loc //Check parent items immunities (recurses up to the turf)
+ return FALSE //RIP you
/datum/weather/acid_rain/weather_act(mob/living/L)
- var/resist = L.getarmor(null, ACID)
- if(prob(max(0,100-resist)))
- L.acid_act(20,20)
+ L.adjust_wet_stacks(2)
+ if(is_acid_immune(L))
+ return
+ if(HAS_TRAIT(L,TRAIT_SULPH_PIT_IMMUNE)) //immunity to the acid doesn't mean immunity to the wet
+ return
+ if(ishuman(L)) //inject metabolites
+ var/mob/living/carbon/human/humie = L
+ if(humie.reagents.get_reagent_amount(/datum/reagent/toxic_metabolites) <= 25) //don't let them get up to the absolute highest metabolites tier, but they should still need to be worried
+ humie.reagents.add_reagent(/datum/reagent/toxic_metabolites, 2)
+ else
+ L.apply_damage_type(0.5, BURN)
+ L.apply_damage_type(0.5, TOX)
diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm
index 21ff686509f9..2d3aea64ac19 100644
--- a/code/datums/weather/weather_types/ash_storm.dm
+++ b/code/datums/weather/weather_types/ash_storm.dm
@@ -86,13 +86,12 @@
return TRUE
if(isliving(L))// if we're a non immune mob inside an immune mob we have to reconsider if that mob is immune to protect ourselves
var/mob/living/the_mob = L
- if((WEATHER_ASH in the_mob.weather_immunities) || (WEATHER_ALL in the_mob.weather_immunities))
+ if(the_mob.weather_immunities & immunity_type)
return TRUE
if(istype(L, /obj/structure/closet))
var/obj/structure/closet/the_locker = L
- if(the_locker.weather_protection)
- if((WEATHER_ASH in the_locker.weather_protection) || (WEATHER_ALL in the_locker.weather_protection))
- return TRUE
+ if(the_locker.weather_protection & immunity_type)
+ return TRUE
L = L.loc //Check parent items immunities (recurses up to the turf)
return FALSE //RIP you
diff --git a/code/datums/weather/weather_types/void_storm.dm b/code/datums/weather/weather_types/void_storm.dm
index ef48d16e4453..d744ef25282a 100644
--- a/code/datums/weather/weather_types/void_storm.dm
+++ b/code/datums/weather/weather_types/void_storm.dm
@@ -17,7 +17,7 @@
protect_indoors = FALSE
target_trait = ZTRAIT_VOIDSTORM
- immunity_type = TRAIT_VOIDSTORM_IMMUNE
+ immunity_type = WEATHER_VOIDSTORM
barometer_predictable = FALSE
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index e3925b12f5e5..0145954ef3a7 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -503,13 +503,13 @@
. = ..()
if(!.)
return FALSE
- R.weather_immunities += WEATHER_LAVA
+ R.weather_immunities |= WEATHER_LAVA
/obj/item/borg/upgrade/lavaproof/deactivate(mob/living/silicon/robot/R, user = usr)
. = ..()
if(!.)
return FALSE
- R.weather_immunities -= WEATHER_LAVA
+ R.weather_immunities &= ~WEATHER_LAVA
/obj/item/borg/upgrade/selfrepair
name = "self-repair module"
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 87034db2c998..53aede1d10c9 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -36,7 +36,7 @@ GLOBAL_LIST_EMPTY(lockers)
var/icon_welded = "welded"
var/icon_broken = "sparking"
/// Protection against weather that being inside of it provides.
- var/list/weather_protection = null
+ var/weather_protection = NONE
/// How close being inside of the thing provides complete pressure safety. Must be between 0 and 1!
contents_pressure_protection = 0
/// How insulated the thing is, for the purposes of calculating body temperature. Must be between 0 and 1!
diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
index 536d10fe4b5c..b63cf1e0c0e1 100644
--- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm
+++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
@@ -156,8 +156,8 @@
mob_storage_capacity = 1
contents_pressure_protection = 0.8
contents_thermal_insulation = 0.5
- foldedbag_path = /obj/item/bodybag/environmental/
- weather_protection = list(WEATHER_ACID, WEATHER_ASH, WEATHER_RAD, WEATHER_SNOW, ) // Does not protect against lava or the The Floor Is Lava spell.
+ foldedbag_path = /obj/item/bodybag/environmental
+ weather_protection = WEATHER_STORM
/obj/structure/closet/body_bag/environmental/nanotrasen
name = "elite environmental protection bag"
@@ -167,7 +167,7 @@
contents_pressure_protection = 1
contents_thermal_insulation = 1
foldedbag_path = /obj/item/bodybag/environmental/nanotrasen/
- weather_protection = list(WEATHER_ALL)
+ weather_protection = WEATHER_STORM
/// Securable enviro. bags
@@ -288,7 +288,7 @@
contents_pressure_protection = 1
contents_thermal_insulation = 1
foldedbag_path = /obj/item/bodybag/environmental/prisoner/syndicate
- weather_protection = list(WEATHER_ALL)
+ weather_protection = WEATHER_STORM
breakout_time = 8 MINUTES
sinch_time = 4 SECONDS
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 9b42aad57ba6..c4bb5770cabc 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -1,5 +1,5 @@
/obj/structure/flora
- resistance_flags = FLAMMABLE
+ resistance_flags = FLAMMABLE | UNACIDABLE
max_integrity = 150
anchored = TRUE
diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm
index 5d196481c387..575483517034 100644
--- a/code/game/turfs/open/lava.dm
+++ b/code/game/turfs/open/lava.dm
@@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(lavasafeties, typecacheof(list(/obj/structure/lattice/catwalk,
return
else if(isliving(buckle_check))
var/mob/living/live = buckle_check
- if(WEATHER_LAVA in live.weather_immunities)
+ if(live.weather_immunities & WEATHER_LAVA)
return
if(!L.on_fire)
@@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(lavasafeties, typecacheof(list(/obj/structure/lattice/catwalk,
if(S && H && S.clothing_flags & LAVAPROTECT && H.clothing_flags & LAVAPROTECT)
return
- if(WEATHER_LAVA in L.weather_immunities)
+ if(L.weather_immunities & WEATHER_LAVA)
return
L.adjustFireLoss(20 * delta_time)
diff --git a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
index 833b32c88d9d..509ab7543090 100644
--- a/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs/clockwork_marauder.dm
@@ -16,7 +16,7 @@
melee_damage_upper = 15
attacktext = "slashes"
attack_sound = 'sound/weapons/bladeslice.ogg'
- weather_immunities = list(WEATHER_LAVA)
+ weather_immunities = ALL
movement_type = FLYING
combat_mode = TRUE
loot = list(/obj/item/clockwork/component/geis_capacitor/fallen_armor)
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index 8764939f6413..5c04cc463fc7 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -180,7 +180,7 @@
var/mob/living/L = thing
if(L.movement_type & FLYING)
return //YOU'RE FLYING OVER IT
- if(WEATHER_SNOW in L.weather_immunities)
+ if(L.weather_immunities & WEATHER_SNOW)
return
var/buckle_check = L.buckling
@@ -193,7 +193,7 @@
else if(isliving(buckle_check))
var/mob/living/live = buckle_check
- if(WEATHER_SNOW in live.weather_immunities)
+ if(live.weather_immunities & WEATHER_SNOW)
return
L.adjustFireLoss(2)
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index eb58c98a9ffd..71bb30fb78de 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -11,7 +11,7 @@
icon_living = "mining_drone"
status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH
mouse_opacity = MOUSE_OPACITY_ICON
- weather_immunities = list(WEATHER_ASH)
+ weather_immunities = WEATHER_STORM
faction = list("neutral")
combat_mode = TRUE
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
index 1c3a373d86bd..dc0d4fef6f95 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm
@@ -45,13 +45,13 @@
else //Maybe uses plasma in the future, although that wouldn't make any sense...
leaping = 1
- weather_immunities += WEATHER_LAVA
+ weather_immunities |= WEATHER_LAVA
update_icons()
throw_at(A, MAX_ALIEN_LEAP_DIST, 1, src, FALSE, TRUE, callback = CALLBACK(src, PROC_REF(leap_end)))
/mob/living/carbon/alien/humanoid/hunter/proc/leap_end()
leaping = 0
- weather_immunities -= WEATHER_LAVA
+ weather_immunities &= ~WEATHER_LAVA
update_icons()
/mob/living/carbon/alien/humanoid/hunter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index fe1b2e561678..42dfc0897804 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -257,7 +257,7 @@
/datum/species/golem/titanium/on_species_loss(mob/living/carbon/C)
. = ..()
- C.weather_immunities -= WEATHER_ASH
+ C.weather_immunities &= ~WEATHER_ASH
//Immune to ash storms and lava
/datum/species/golem/plastitanium
@@ -278,8 +278,8 @@
/datum/species/golem/plastitanium/on_species_loss(mob/living/carbon/C)
. = ..()
- C.weather_immunities -= WEATHER_ASH
- C.weather_immunities -= WEATHER_LAVA
+ C.weather_immunities &= ~WEATHER_ASH
+ C.weather_immunities &= ~WEATHER_LAVA
//Fast and regenerates... but can only speak like an abductor
/datum/species/golem/alloy
@@ -1026,7 +1026,7 @@
/datum/species/golem/snow/on_species_loss(mob/living/carbon/remove_from)
. = ..()
- remove_from.weather_immunities -= WEATHER_SNOW
+ remove_from.weather_immunities &= ~WEATHER_SNOW
QDEL_NULL(snowball)
QDEL_NULL(cryo)
return ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index 211f467644ee..b12a4f36e86c 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -208,7 +208,7 @@
/datum/species/lizard/ashwalker/on_species_loss(mob/living/carbon/C)
. = ..()
- C.weather_immunities -= WEATHER_ASH
+ C.weather_immunities &= ~WEATHER_ASH
//Ash walker shaman, worse defensive stats, but better at surgery and have a healing touch ability
/datum/species/lizard/ashwalker/shaman
@@ -293,7 +293,7 @@
/datum/species/lizard/draconid/on_species_loss(mob/living/carbon/C)
. = ..()
- C.weather_immunities -= WEATHER_ASH
+ C.weather_immunities &= ~WEATHER_ASH
// yogs end
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index d877b94db9f2..27cba5475c88 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -85,7 +85,7 @@
var/hellbound = 0 //People who've signed infernal contracts are unrevivable.
- var/list/weather_immunities = list()
+ var/weather_immunities = NONE
var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index b2e96071a8a6..6618eab4a9b5 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -8,7 +8,7 @@
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_TINY
desc = "A generic pAI mobile hard-light holographics emitter. It seems to be deactivated."
- weather_immunities = list(WEATHER_ASH)
+ weather_immunities = WEATHER_STORM
light_on = FALSE
light_flags = LIGHT_ATTACHED
light_system = MOVABLE_LIGHT
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 7de40e64d655..755d52d29ca4 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -8,7 +8,7 @@
initial_language_holder = /datum/language_holder/synthetic
infra_luminosity = 0
bubble_icon = BUBBLE_MACHINE
- weather_immunities = list(WEATHER_ASH)
+ weather_immunities = WEATHER_STORM
mob_biotypes = MOB_ROBOTIC
deathsound = 'sound/voice/borg_deathsound.ogg'
speech_span = SPAN_ROBOT
diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm
index a5588ada87b6..347bed9c3df3 100644
--- a/code/modules/mob/living/simple_animal/hostile/bear.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bear.dm
@@ -58,7 +58,7 @@
icon_living = "snowbear"
icon_dead = "snowbear_dead"
desc = "It's a polar bear, in space, but not actually in space."
- weather_immunities = list(WEATHER_SNOW)
+ weather_immunities = WEATHER_STORM
/mob/living/simple_animal/hostile/bear/russian
name = "combat bear"
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm b/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm
index 60322cf929dd..1caed9c258be 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/_jungle_mobs.dm
@@ -2,7 +2,7 @@
vision_range = 5
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("jungle")
- weather_immunities = list(WEATHER_ACID)
+ weather_immunities = WEATHER_STORM
obj_damage = 30
environment_smash = ENVIRONMENT_SMASH_WALLS
minbodytemp = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
index 92f976a8df38..1efe667fcf48 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
@@ -11,7 +11,7 @@
obj_damage = 400
light_range = 3
faction = list("mining", "boss")
- weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
+ weather_immunities = ALL
movement_type = FLYING
robust_searching = TRUE
ranged_ignores_vision = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
index 6c626c2ff93d..c10268e21109 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm
@@ -17,7 +17,7 @@ Difficulty: Extremely Hard
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
light_color = "#E4C7C5"
movement_type = GROUND
- weather_immunities = list(WEATHER_SNOW)
+ weather_immunities = WEATHER_STORM
speak_emote = list("roars")
armour_penetration = 100
melee_damage_lower = 10
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/stalwart.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/stalwart.dm
index 91e5992a41a5..2c87d5d02254 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/stalwart.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/stalwart.dm
@@ -305,7 +305,7 @@
attack_sound = 'sound/weapons/pierce_slow.ogg'
speak_emote = list("buzzes")
faction = list("mining")
- weather_immunities = list(WEATHER_LAVA,WEATHER_ASH)
+ weather_immunities = ALL
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/staldrone/Initialize(mapload)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
index 29ae5b37bd48..548249721272 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
@@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
mob_biotypes = MOB_ROBOTIC
gps_name = "Hungry Signal"
faction = list("mining", "boss", "swarmer")
- weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
+ weather_immunities = ALL
stop_automated_movement = TRUE
wander = FALSE
layer = BELOW_MOB_LAYER
@@ -107,7 +107,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
/mob/living/simple_animal/hostile/swarmer/ai
wander = 1
faction = list("swarmer", "mining")
- weather_immunities = list(WEATHER_ASH) //wouldn't be fun otherwise
+ weather_immunities = WEATHER_STORM //wouldn't be fun otherwise
AIStatus = AI_ON
/mob/living/simple_animal/hostile/swarmer/ai/Initialize(mapload)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/drakeling.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/drakeling.dm
index bf4aeb30d7d5..b0a0ced2bb99 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/drakeling.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/drakeling.dm
@@ -22,7 +22,7 @@
response_disarm = "gently pushes aside"
response_harm = "kicks"
speak_chance = 5
- weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
+ weather_immunities = ALL
movement_type = FLYING
faction = list("neutral")
minbodytemp = 0 //SPACE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
index cda0197d9ab9..c54bb8ea2558 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm
@@ -10,7 +10,7 @@
speak_emote = list("warbles", "quavers")
emote_hear = list("trills.")
emote_see = list("sniffs.", "burps.")
- weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
+ weather_immunities = ALL
faction = list("mining", "ashwalker")
density = FALSE
speak_chance = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 5665be5a50e2..250b67b2a024 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -276,7 +276,7 @@
aggro_vision_range = 9
speed = 3
faction = list("mining")
- weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
+ weather_immunities = ALL
obj_damage = 30
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
// Purple, but bright cause we're gonna need to spot mobs on lavaland
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
index 342a7a0853c0..f3bbcd2d4cb5 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
@@ -3,7 +3,7 @@
vision_range = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("mining")
- weather_immunities = list(WEATHER_LAVA, WEATHER_ASH, WEATHER_SNOW)
+ weather_immunities = ALL
obj_damage = 30
environment_smash = ENVIRONMENT_SMASH_WALLS
minbodytemp = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index 954aff0ead2a..0892c4b4f064 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -46,7 +46,7 @@
icon_dead = "eskimo_dead"
maxHealth = 55
health = 55
- weather_immunities = list(WEATHER_SNOW)
+ weather_immunities = WEATHER_STORM
gold_core_spawnable = NO_SPAWN
melee_damage_lower = 17
melee_damage_upper = 20
@@ -65,7 +65,7 @@
icon_dead = "templar_dead"
maxHealth = 150
health = 150
- weather_immunities = list(WEATHER_SNOW)
+ weather_immunities = WEATHER_STORM
speed = 2
gold_core_spawnable = NO_SPAWN
speak_chance = 1
@@ -86,7 +86,7 @@
speed = 5
maxHealth = 75
health = 75
- weather_immunities = list(WEATHER_SNOW)
+ weather_immunities = WEATHER_STORM
color = rgb(114,228,250)
loot = list(/obj/effect/decal/remains/human{color = rgb(114,228,250)})
diff --git a/sound/ambience/acidrain_end.ogg b/sound/ambience/acidrain_end.ogg
deleted file mode 100644
index d02299c6c0df..000000000000
Binary files a/sound/ambience/acidrain_end.ogg and /dev/null differ
diff --git a/sound/ambience/acidrain_mid.ogg b/sound/ambience/acidrain_mid.ogg
deleted file mode 100644
index 13dd3a59cb88..000000000000
Binary files a/sound/ambience/acidrain_mid.ogg and /dev/null differ
diff --git a/sound/ambience/acidrain_start.ogg b/sound/ambience/acidrain_start.ogg
deleted file mode 100644
index 27e47372944f..000000000000
Binary files a/sound/ambience/acidrain_start.ogg and /dev/null differ
diff --git a/sound/weather/acidrain/acidrain_telegraph.ogg b/sound/weather/acidrain/acidrain_telegraph.ogg
new file mode 100644
index 000000000000..800d2dbb1dd5
Binary files /dev/null and b/sound/weather/acidrain/acidrain_telegraph.ogg differ
diff --git a/sound/weather/acidrain/inside/acidrain_inside_end.ogg b/sound/weather/acidrain/inside/acidrain_inside_end.ogg
new file mode 100644
index 000000000000..971fc8824c35
Binary files /dev/null and b/sound/weather/acidrain/inside/acidrain_inside_end.ogg differ
diff --git a/sound/weather/acidrain/inside/acidrain_inside_mid1.ogg b/sound/weather/acidrain/inside/acidrain_inside_mid1.ogg
new file mode 100644
index 000000000000..6d7363e5509f
Binary files /dev/null and b/sound/weather/acidrain/inside/acidrain_inside_mid1.ogg differ
diff --git a/sound/weather/acidrain/inside/acidrain_inside_mid2.ogg b/sound/weather/acidrain/inside/acidrain_inside_mid2.ogg
new file mode 100644
index 000000000000..4a8fc4105744
Binary files /dev/null and b/sound/weather/acidrain/inside/acidrain_inside_mid2.ogg differ
diff --git a/sound/weather/acidrain/inside/acidrain_inside_mid3.ogg b/sound/weather/acidrain/inside/acidrain_inside_mid3.ogg
new file mode 100644
index 000000000000..58033fe7b6cd
Binary files /dev/null and b/sound/weather/acidrain/inside/acidrain_inside_mid3.ogg differ
diff --git a/sound/weather/acidrain/inside/acidrain_inside_mid4.ogg b/sound/weather/acidrain/inside/acidrain_inside_mid4.ogg
new file mode 100644
index 000000000000..ba85eb65d314
Binary files /dev/null and b/sound/weather/acidrain/inside/acidrain_inside_mid4.ogg differ
diff --git a/sound/weather/acidrain/inside/acidrain_inside_start.ogg b/sound/weather/acidrain/inside/acidrain_inside_start.ogg
new file mode 100644
index 000000000000..b6f65ad444b3
Binary files /dev/null and b/sound/weather/acidrain/inside/acidrain_inside_start.ogg differ
diff --git a/sound/weather/acidrain/outside/acidrain_outside_end.ogg b/sound/weather/acidrain/outside/acidrain_outside_end.ogg
new file mode 100644
index 000000000000..18a284260658
Binary files /dev/null and b/sound/weather/acidrain/outside/acidrain_outside_end.ogg differ
diff --git a/sound/weather/acidrain/outside/acidrain_outside_mid1.ogg b/sound/weather/acidrain/outside/acidrain_outside_mid1.ogg
new file mode 100644
index 000000000000..e70093f62cc8
Binary files /dev/null and b/sound/weather/acidrain/outside/acidrain_outside_mid1.ogg differ
diff --git a/sound/weather/acidrain/outside/acidrain_outside_mid2.ogg b/sound/weather/acidrain/outside/acidrain_outside_mid2.ogg
new file mode 100644
index 000000000000..eb4912f97a70
Binary files /dev/null and b/sound/weather/acidrain/outside/acidrain_outside_mid2.ogg differ
diff --git a/sound/weather/acidrain/outside/acidrain_outside_mid3.ogg b/sound/weather/acidrain/outside/acidrain_outside_mid3.ogg
new file mode 100644
index 000000000000..0b97c2d3531c
Binary files /dev/null and b/sound/weather/acidrain/outside/acidrain_outside_mid3.ogg differ
diff --git a/sound/weather/acidrain/outside/acidrain_outside_mid4.ogg b/sound/weather/acidrain/outside/acidrain_outside_mid4.ogg
new file mode 100644
index 000000000000..7f16e979a420
Binary files /dev/null and b/sound/weather/acidrain/outside/acidrain_outside_mid4.ogg differ
diff --git a/sound/weather/acidrain/outside/acidrain_outside_start.ogg b/sound/weather/acidrain/outside/acidrain_outside_start.ogg
new file mode 100644
index 000000000000..c80bb8ec6127
Binary files /dev/null and b/sound/weather/acidrain/outside/acidrain_outside_start.ogg differ
diff --git a/yogstation/code/datums/status_effects/buffs.dm b/yogstation/code/datums/status_effects/buffs.dm
index 9cdea941cfe9..a38163928ebe 100644
--- a/yogstation/code/datums/status_effects/buffs.dm
+++ b/yogstation/code/datums/status_effects/buffs.dm
@@ -76,7 +76,7 @@
shield.pixel_x = -owner.pixel_x
shield.pixel_y = -owner.pixel_y
owner.overlays += shield
- owner.weather_immunities |= WEATHER_ASH //no free charges/heals
+ owner.weather_immunities |= WEATHER_STORM //no free charges/heals
for(var/traits in grimoire_traits)
ADD_TRAIT(owner, traits, GRIMOIRE_TRAIT)
return ..()
@@ -96,7 +96,7 @@
if(owner)
for(var/traits in grimoire_traits)
REMOVE_TRAIT(owner, traits, GRIMOIRE_TRAIT)
- owner.weather_immunities -= WEATHER_ASH
+ owner.weather_immunities &= ~WEATHER_STORM //might this remove immunity granted from other sources?
owner.overlays -= shield
owner.extinguish_mob()
owner.AdjustStun(-200)
diff --git a/yogstation/code/game/gamemodes/battle_royale/storm.dm b/yogstation/code/game/gamemodes/battle_royale/storm.dm
index d7bc1bf4ecaf..0c00e9711fb5 100644
--- a/yogstation/code/game/gamemodes/battle_royale/storm.dm
+++ b/yogstation/code/game/gamemodes/battle_royale/storm.dm
@@ -8,7 +8,7 @@
end_message = null
telegraph_duration = 10 SECONDS //actually give them a brief moment to react
end_duration = 1
- immunity_type = "fuckno"
+ immunity_type = NONE
telegraph_sound = 'yogstation/sound/effects/battleroyale/stormclosing.ogg'
end_sound = 'yogstation/sound/effects/battleroyale/stormalert.ogg'
weather_duration = INFINITY
diff --git a/yogstation/code/modules/admin/admin_verbs.dm b/yogstation/code/modules/admin/admin_verbs.dm
index 45db69984ab1..0441161b23b3 100644
--- a/yogstation/code/modules/admin/admin_verbs.dm
+++ b/yogstation/code/modules/admin/admin_verbs.dm
@@ -103,7 +103,7 @@
/client/proc/set_next_minetype()
set name = "Set Next Minetype"
set category = "Server"
- set desc = "Sets the next mintype (jungleland or lavaland), provided that the map allows it."
+ set desc = "Sets the next minetype (jungleland or lavaland), provided that the map allows it."
var/list/l = list("Jungleland" = 0, "Lavaland" = 1, "Either" = 2)
var/answer = input(src,"Which one do you choose?","Selection","Either") in l
if(!answer)
diff --git a/yogstation/code/modules/antagonists/darkspawn/darkspawn_progenitor.dm b/yogstation/code/modules/antagonists/darkspawn/darkspawn_progenitor.dm
index 8ba1f100d366..642493259f19 100644
--- a/yogstation/code/modules/antagonists/darkspawn/darkspawn_progenitor.dm
+++ b/yogstation/code/modules/antagonists/darkspawn/darkspawn_progenitor.dm
@@ -19,7 +19,7 @@
armour_penetration = 100
obj_damage = INFINITY
environment_smash = ENVIRONMENT_SMASH_RWALLS
- weather_immunities = list(WEATHER_LAVA, WEATHER_ASH)
+ weather_immunities = ALL
status_flags = NONE
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) //Leaving something at 0 means it's off - has no maximum
unsuitable_atmos_damage = 0
diff --git a/yogstation/code/modules/jungleland/jungle_datums.dm b/yogstation/code/modules/jungleland/jungle_datums.dm
index 19e5698d77b4..c4cc34fccd72 100644
--- a/yogstation/code/modules/jungleland/jungle_datums.dm
+++ b/yogstation/code/modules/jungleland/jungle_datums.dm
@@ -520,111 +520,83 @@
name = "Concentrated toxin"
toxpwr = 2
-#define STAGE_1_THRESHOLD 15
-#define STAGE_2_THRESHOLD 30
-#define STAGE_3_THRESHOLD 45
+#define STAGE_THRESHOLD 15
#define ALERT_ID "toxic_buildup_metabolites"
-/datum/reagent/toxic_metabolities
- name = "Toxic metabolities"
+/datum/reagent/toxic_metabolites
+ name = "Toxic metabolites"
description = "Deadly toxic buildup of metabolities caused by direct exposition to jungleland's environment."
- taste_description = "death"
color = "#002d09"
harmful = TRUE
can_synth = FALSE
self_consuming = TRUE
taste_mult = 100
+ taste_description = "death"
metabolization_rate = 0.5
var/stage = 1
- var/old_volume = 0
+ var/old_stage = 1
var/alert_type = /atom/movable/screen/alert/status_effect/toxic_buildup
// consumes 2 every 2 seconds
-/datum/reagent/toxic_metabolities/on_mob_life(mob/living/carbon/M)
+/datum/reagent/toxic_metabolites/on_mob_life(mob/living/carbon/M)
. = ..()
if(HAS_TRAIT(M,TRAIT_SULPH_PIT_IMMUNE))
cure()
return
- switch(volume)
- if(0 to STAGE_1_THRESHOLD)
- if(old_volume > STAGE_1_THRESHOLD)
- decrement_stage(M)
+ stage = min(floor(volume/STAGE_THRESHOLD) + 1, 4)
+ if(stage != old_stage) //so we don't keep updating the alert if we don't need to
+ M.throw_alert(ALERT_ID,alert_type,stage)
+ old_stage = stage
+
+ switch(stage)
+ if(1)
M.adjustToxLoss(0.25, forced = TRUE)
- // STAGE 1
- if(STAGE_1_THRESHOLD to STAGE_2_THRESHOLD)
- if(old_volume < STAGE_1_THRESHOLD)
- increment_stage(M)
- if(old_volume > STAGE_2_THRESHOLD)
- decrement_stage(M)
+ if(2)
M.adjustToxLoss(0.5, forced = TRUE)
M.adjustOrganLoss(ORGAN_SLOT_LIVER,0.25)
- M.adjustStaminaLoss(2.5)
if(prob(2.5))
to_chat(M, "You feel slight burning coming from within you, as the toxins singe you from within!")
M.adjustFireLoss(5)
- // STAGE 2
- if(STAGE_2_THRESHOLD to STAGE_3_THRESHOLD)
- if(old_volume < STAGE_2_THRESHOLD)
- increment_stage(M)
- if(old_volume > STAGE_3_THRESHOLD)
- decrement_stage(M)
+
+ if(3)
M.adjustToxLoss(1, forced = TRUE)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER,0.5)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.5)
M.adjustStaminaLoss(5)
+ M.clear_stamina_regen()
if(prob(5))
to_chat(M, "You feel a burning sensation coming from within you, as the toxins burn you from within!")
M.adjustFireLoss(10)
- // STAGE 3
- if(STAGE_3_THRESHOLD to INFINITY)
- if(old_volume < STAGE_3_THRESHOLD)
- increment_stage(M)
+
+ if(4)
M.adjustToxLoss(2.5, forced = TRUE)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER,1)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1)
M.adjustStaminaLoss(10)
+ M.clear_stamina_regen()
if(prob(10))
to_chat(M, "You feel deep burning sensation from within as the toxins burn you from within!")
M.adjustFireLoss(15)
- // STAGE 4
- old_volume = volume
-/datum/reagent/toxic_metabolities/on_mob_add(mob/living/L)
+/datum/reagent/toxic_metabolites/on_mob_add(mob/living/L)
. = ..()
if(HAS_TRAIT(L,TRAIT_SULPH_PIT_IMMUNE))
cure()
return
- RegisterSignal(L,COMSIG_REGEN_CORE_HEALED,PROC_REF(cure))
- switch(volume)
- if(0 to STAGE_1_THRESHOLD)
- stage = 1
- if(STAGE_1_THRESHOLD to STAGE_2_THRESHOLD)
- stage = 2
- if(STAGE_2_THRESHOLD to STAGE_3_THRESHOLD)
- stage = 3
- if(STAGE_3_THRESHOLD to INFINITY)
- stage = 4
- old_volume = volume
+ RegisterSignal(L, COMSIG_REGEN_CORE_HEALED,PROC_REF(cure))
+ stage = min(floor(volume/STAGE_THRESHOLD) + 1, 4)
+ old_stage = stage
L.throw_alert(ALERT_ID,alert_type,stage)
-/datum/reagent/toxic_metabolities/on_mob_delete(mob/living/L)
+/datum/reagent/toxic_metabolites/on_mob_delete(mob/living/L)
+ UnregisterSignal(L, COMSIG_REGEN_CORE_HEALED)
L.clear_alert(ALERT_ID)
return ..()
-
-/datum/reagent/toxic_metabolities/proc/decrement_stage(mob/living/L)
- stage = max(1,stage - 1)
- L.throw_alert(ALERT_ID,alert_type,stage)
-
-/datum/reagent/toxic_metabolities/proc/increment_stage(mob/living/L)
- stage = min(4,stage + 1)
- L.throw_alert(ALERT_ID,alert_type,stage)
-/datum/reagent/toxic_metabolities/proc/cure()
+/datum/reagent/toxic_metabolites/proc/cure()
if(holder)
holder.remove_reagent(type, volume)
-#undef STAGE_1_THRESHOLD
-#undef STAGE_2_THRESHOLD
-#undef STAGE_3_THRESHOLD
+#undef STAGE_THRESHOLD
#undef ALERT_ID
diff --git a/yogstation/code/modules/jungleland/jungle_items.dm b/yogstation/code/modules/jungleland/jungle_items.dm
index 5d5a53d5c6e0..140592afb103 100644
--- a/yogstation/code/modules/jungleland/jungle_items.dm
+++ b/yogstation/code/modules/jungleland/jungle_items.dm
@@ -8,7 +8,7 @@
if(!isliving(user))
return
var/mob/living/living_user = user
- living_user.reagents.add_reagent(/datum/reagent/toxic_metabolities,15)
+ living_user.reagents.add_reagent(/datum/reagent/toxic_metabolites,15)
/obj/item/dummy_malaria
name = "test dummy"
desc = "what"
diff --git a/yogstation/code/modules/jungleland/jungle_mobs.dm b/yogstation/code/modules/jungleland/jungle_mobs.dm
index 252df47a159d..b8ca47cb1409 100644
--- a/yogstation/code/modules/jungleland/jungle_mobs.dm
+++ b/yogstation/code/modules/jungleland/jungle_mobs.dm
@@ -1,7 +1,7 @@
/mob/living/simple_animal/hostile/yog_jungle //yog_jungle and not just jungle because TG has some mobs under /jungle/ that i dont want to fuck with and override (they are unused, but like whats the point..)
icon = 'yogstation/icons/mob/jungle.dmi'
stat_attack = UNCONSCIOUS
- weather_immunities = WEATHER_ACID
+ weather_immunities = WEATHER_STORM
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list("mining", "skintwister_cloak")
see_in_dark = 3
@@ -135,7 +135,7 @@
var/mob/living/carbon/human/humie = target
var/chance = 100 - humie.getarmor(null,BIO)
if(prob(max(10,chance * 0.66))) // higher chance than toxic water
- humie.reagents.add_reagent(/datum/reagent/toxic_metabolities,2.5)
+ humie.reagents.add_reagent(/datum/reagent/toxic_metabolites,2.5)
/mob/living/simple_animal/hostile/yog_jungle/meduracha/Goto(target, delay, minimum_distance)
update_sulking(TRUE)
@@ -623,7 +623,7 @@
/mob/living/simple_animal/hostile/tar
icon = 'yogstation/icons/mob/jungle.dmi'
stat_attack = DEAD
- weather_immunities = WEATHER_ACID
+ weather_immunities = WEATHER_STORM
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
robust_searching = TRUE
see_in_dark = 5
@@ -735,7 +735,7 @@ mob/living/simple_animal/hostile/asteroid/hivelord/tar
desc = "A solid chunk of tar. You struggle to think that something like this could even be alive, but it seems to pulsate and even move at times..."
icon = 'yogstation/icons/mob/jungle.dmi'
stat_attack = DEAD
- weather_immunities = WEATHER_ACID
+ weather_immunities = WEATHER_STORM
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
robust_searching = TRUE
see_in_dark = 5
@@ -769,7 +769,7 @@ mob/living/simple_animal/hostile/asteroid/hivelord/tar
icon_aggro = "tar_aspect"
icon_dead = "tar_aspect"
stat_attack = DEAD
- weather_immunities = WEATHER_ACID
+ weather_immunities = WEATHER_STORM
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
robust_searching = TRUE
see_in_dark = 5
diff --git a/yogstation/code/modules/jungleland/jungle_projectiles.dm b/yogstation/code/modules/jungleland/jungle_projectiles.dm
index 23fc126b83f4..19289ce39d9f 100644
--- a/yogstation/code/modules/jungleland/jungle_projectiles.dm
+++ b/yogstation/code/modules/jungleland/jungle_projectiles.dm
@@ -28,4 +28,4 @@
var/mob/living/carbon/human/H = target
var/chance = 100 - H.getarmor(null,BIO)
if(prob(max(10,chance * 0.75))) // higher chance than toxic water
- H.reagents.add_reagent(/datum/reagent/toxic_metabolities,15)
+ H.reagents.add_reagent(/datum/reagent/toxic_metabolites,15)
diff --git a/yogstation/code/modules/jungleland/jungle_structures.dm b/yogstation/code/modules/jungleland/jungle_structures.dm
index 2362ca888e32..bde21991447a 100644
--- a/yogstation/code/modules/jungleland/jungle_structures.dm
+++ b/yogstation/code/modules/jungleland/jungle_structures.dm
@@ -364,6 +364,7 @@
faction = list("mining")
max_mobs = 3
max_integrity = 250
+ resistance_flags = UNACIDABLE
move_resist = INFINITY
anchored = TRUE
density = FALSE
diff --git a/yogstation/code/modules/jungleland/jungle_turfs.dm b/yogstation/code/modules/jungleland/jungle_turfs.dm
index 4fb57a6b7958..3e6e27471824 100644
--- a/yogstation/code/modules/jungleland/jungle_turfs.dm
+++ b/yogstation/code/modules/jungleland/jungle_turfs.dm
@@ -216,7 +216,7 @@ Temperature: 126.85 °C (400 K)
else if (isliving(thing))
. = TRUE
var/mob/living/L = thing
- if(WEATHER_ACID in L.weather_immunities) //if they're immune to acid weather
+ if(L.weather_immunities & WEATHER_ACID) //if they're immune to acid weather
return
if(L.movement_type & (FLYING|FLOATING)) //YOU'RE FLYING OVER IT
return
@@ -233,7 +233,7 @@ Temperature: 126.85 °C (400 K)
return
else if(isliving(buckle_check))
var/mob/living/live = buckle_check
- if(WEATHER_ACID in live.weather_immunities)
+ if(live.weather_immunities & WEATHER_ACID)
return
if(live.movement_type & (FLYING|FLOATING))
return
@@ -255,7 +255,7 @@ Temperature: 126.85 °C (400 K)
if(HAS_TRAIT(L,TRAIT_TOXIMMUNE) || HAS_TRAIT(L,TRAIT_TOXINLOVER))
return
- humie.reagents.add_reagent(/datum/reagent/toxic_metabolities, 2 * acid_strength)
+ humie.reagents.add_reagent(/datum/reagent/toxic_metabolites, 2 * acid_strength)
else if(prob(25 * acid_strength))
L.acid_act(5 * acid_strength, 7.5 * acid_strength)
diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/plantpeople.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/plantpeople.dm
index 14b8e2396dd3..7371d816dc5e 100644
--- a/yogstation/code/modules/mob/living/carbon/human/species_types/plantpeople.dm
+++ b/yogstation/code/modules/mob/living/carbon/human/species_types/plantpeople.dm
@@ -396,7 +396,7 @@
name = "Ivymen"
id = "ivymen"
limbs_id = SPECIES_PODPERSON
- inherent_traits = list(TRAIT_NOGUNS,TRAIT_RESISTHIGHPRESSURE)
+ inherent_traits = list(TRAIT_NOGUNS,TRAIT_RESISTHIGHPRESSURE, TRAIT_SULPH_PIT_IMMUNE)
speedmod = 0
mutantlungs = /obj/item/organ/lungs/plant/ivymen
disliked_food = DAIRY
@@ -407,7 +407,7 @@
/datum/species/pod/ivymen/on_species_loss(mob/living/carbon/C)
. = ..()
- C.weather_immunities -= WEATHER_ACID
+ C.weather_immunities &= ~WEATHER_ACID
#undef STATUS_MESSAGE_COOLDOWN
diff --git a/yogstation/code/modules/mob/living/simple_animal/hostile/abominations.dm b/yogstation/code/modules/mob/living/simple_animal/hostile/abominations.dm
index 846bdb711117..b209b892add4 100644
--- a/yogstation/code/modules/mob/living/simple_animal/hostile/abominations.dm
+++ b/yogstation/code/modules/mob/living/simple_animal/hostile/abominations.dm
@@ -16,7 +16,7 @@
speak_emote = list("screams")
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
- weather_immunities = list(WEATHER_ASH)
+ weather_immunities = WEATHER_STORM
stat_attack = UNCONSCIOUS
/mob/living/simple_animal/hostile/abomination/super