Files
Bubberstation/code/__DEFINES/weather.dm
Tim e732a19949 Add wizard event - Magical Rain (#90495)
## About The Pull Request
Adds a new wizard event - Magical Rain

This selects a random reagent from a curtailed list that is rained down
on the station. The only safe spaces are in maintenance and containers
like lockers. Of course the wizard is not directly affected by the
reagent, although side effects may still apply. For example, if it is
raining lube, it will cause turfs to get slippery which can slip the
wizard. You can also collect the rain in containers, which might be
funny or useful depending on what it is. (Alcoholics love booze rain)

I did have to trim down the list of reagents since there are over +700
and most of them do nothing to mobs/turfs when they `TOUCH`. The list is
~50 reagents that are:

```dm
	// most medicine do nothing when it comes into contact with turfs or mobs (via TOUCH) except for a few
	var/list/allowed_medicine = list(
		/datum/reagent/medicine/c2/synthflesh,
		/datum/reagent/medicine/adminordrazine,
		/datum/reagent/medicine/strange_reagent,
		// include a random medicine
		pick(subtypesof(/datum/reagent/medicine)),
	)
	GLOB.wizard_rain_reagents |= allowed_medicine

	// One randomized type is allowed so the whitelist isn't spammed with subtypes
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent/glitter))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent/carpet))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent/mutationtoxin))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent/plantnutriment))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent/uranium))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent/luminescent_fluid))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent/impurity))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent/drug))
	GLOB.wizard_rain_reagents |= pick(typesof(/datum/reagent/water))
	GLOB.wizard_rain_reagents |= pick(typesof(/datum/reagent/fuel))
	GLOB.wizard_rain_reagents |= pick(typesof(/datum/reagent/colorful_reagent))
	GLOB.wizard_rain_reagents |= pick(typesof(/datum/reagent/ants))
	GLOB.wizard_rain_reagents |= pick(typesof(/datum/reagent/lube))
	GLOB.wizard_rain_reagents |= pick(typesof(/datum/reagent/space_cleaner))

	// lots of toxins do nothing so we need to be picky
	var/list/allowed_toxins = list(
		/datum/reagent/toxin/itching_powder,
		/datum/reagent/toxin/polonium, // radiation
		/datum/reagent/toxin/mutagen,
		// all the acids
		/datum/reagent/toxin/acid,
		/datum/reagent/toxin/acid/fluacid,
		/datum/reagent/toxin/acid/nitracid,
		// include a random toxin
		pick(subtypesof(/datum/reagent/toxin)),
	)
	GLOB.wizard_rain_reagents |= allowed_toxins

	// too many food & drinks so blacklist most of them
	var/list/allowed_food_drinks = list(
		/datum/reagent/consumable/ethanol/wizz_fizz,
		/datum/reagent/consumable/condensedcapsaicin,
		/datum/reagent/consumable/frostoil,
		// include a random food or drink
		pick(subtypesof(/datum/reagent/consumable)),
		// include a random regular drink (vodka, wine, beer, etc.)
		pick(/obj/machinery/chem_dispenser/drinks/beer::beer_dispensable_reagents),
	)
	GLOB.wizard_rain_reagents |= allowed_food_drinks

	var/list/allowed_exotic_reagents = list(
		// fire
		/datum/reagent/clf3,
		/datum/reagent/phlogiston,
		/datum/reagent/napalm,
		// cosmetic
		/datum/reagent/hair_dye,
		/datum/reagent/barbers_aid,
		/datum/reagent/baldium,
		/datum/reagent/mulligan,
		/datum/reagent/growthserum,
		// op shit
		/datum/reagent/romerol,
		/datum/reagent/gondola_mutation_toxin,
		/datum/reagent/metalgen,
		/datum/reagent/flightpotion,
		/datum/reagent/eigenstate,
		/datum/reagent/magillitis,
		/datum/reagent/pax,
		/datum/reagent/gluttonytoxin,
		/datum/reagent/aslimetoxin,
		// misc
		/datum/reagent/blood,
		/datum/reagent/hauntium,
		/datum/reagent/copper,
	)
	GLOB.wizard_rain_reagents |= allowed_exotic_reagents

	// add a few randomized reagents not listed above so they at least have a chance
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent))
	GLOB.wizard_rain_reagents |= pick(subtypesof(/datum/reagent))
```

## Why It's Good For The Game
More interesting effects for weather. The wizard events are always
supposed to be silly and wacky, so having stuff like raining ants or
booze is hilarious. Several OP chems are included like napalm, strange
reagent, and flight potion which can lead to some chaos.

## Changelog
🆑
add: Add wizard magical rain event. A random reagent is selected to rain
down across the station. The only places to escape are in maintenance
and inside containers such as lockers. The wizard is not directly
affected by the reagent, but the side effects might still apply. (ie.
raining lube, will make the floors slippery, which can slip the wizard)
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
2025-04-29 17:54:00 -06:00

59 lines
2.9 KiB
Plaintext

//A reference to this list is passed into area sound managers, and it's modified in a manner that preserves that reference in ash_storm.dm
GLOBAL_LIST_EMPTY(ash_storm_sounds)
GLOBAL_LIST_EMPTY(rain_storm_sounds)
GLOBAL_LIST_EMPTY(sand_storm_sounds)
/// Tracks where we should play snowstorm sounds for the area sound listener
GLOBAL_LIST_EMPTY(snowstorm_sounds)
/// The wizard rain event can run multiple times so we use a global reagent whitelist to reuse the same list to boost performance
GLOBAL_LIST_EMPTY(wizard_rain_reagents)
#define STARTUP_STAGE 1
#define MAIN_STAGE 2
#define WIND_DOWN_STAGE 3
#define END_STAGE 4
/// The amount of reagent units that is applied when an object comes into contact with rain
#define WEATHER_REAGENT_VOLUME 5
/// Weather reagent volume applied to randomly selected turfs/objects is scaled by this multiplier to compensate for reduced processing frequency
#define TURF_REAGENT_VOLUME_MULTIPLIER 3
/// 1 / 400 chance for a turf to get a thunder strike per tick (death and destruction to mobs/equipment in area)
#define THUNDER_CHANCE_INSANE 0.0025
/// 1 / 1,000 chance for a turf to get a thunder strike per tick (damage to mobs/equipment in area)
#define THUNDER_CHANCE_HIGH 0.001
/// 1 / 5,000 chance for a turf to get a thunder strike per tick (sporadic damage to mobs/equipment in area)
#define THUNDER_CHANCE_AVERAGE 0.0002
/// 1 / 20,000 chance for a turf to get a thunder strike per tick (rare damage to mobs/equipment in area)
#define THUNDER_CHANCE_RARE 0.00005
/// 1 / 50,000 chance for a turf to get a thunder strike per tick (almost no damage to mobs/equipment in area)
#define THUNDER_CHANCE_VERY_RARE 0.00002
/// admin verb to control thunder via the run_weather command
GLOBAL_LIST_INIT(thunder_chance_options, list(
"Relentless - The Sky is Angry, Very Angry" = THUNDER_CHANCE_INSANE,
"Abundant - A shocking amount of thunder" = THUNDER_CHANCE_HIGH,
"Regular - Standard Storm Activity" = THUNDER_CHANCE_AVERAGE,
"Occasional - A polite amount of thunder" = THUNDER_CHANCE_RARE,
"Rare - Like finding a four-leaf clover, but in the sky" = THUNDER_CHANCE_VERY_RARE,
"None - Admin Safe Space (Thunder Disabled)" = NONE,
))
//WEATHER FLAGS
/// If weather will affect turfs
#define WEATHER_TURFS (1<<0)
/// If weather will affect mobs
#define WEATHER_MOBS (1<<1)
/// If weather will apply thunder strikes to turfs
#define WEATHER_THUNDER (1<<2)
/// If weather will be allowed to affect indoor areas
#define WEATHER_INDOORS (1<<3)
/// If weather is endless and can only be stopped manually
#define WEATHER_ENDLESS (1<<4)
/// If weather will be detected by a barometer
#define WEATHER_BAROMETER (1<<5)
/// If weather temperature ignores clothing insulation when adjusting bodytemperature
#define WEATHER_TEMPERATURE_BYPASS_CLOTHING (1<<6)
/// Does weather have any type of processing related to mobs, turfs, or thunder?
#define FUNCTIONAL_WEATHER (WEATHER_TURFS|WEATHER_MOBS|WEATHER_THUNDER)