* Based on https://github.com/tgstation/tgstation/pull/25386
* Create macro for defining new subsystem types.
* Create PreInit proc to handle setup that needs to be done before the map loads
* Rename garbage_controller subsystem to garbage so it matches its global SSgarbage variable name.
* Settings for specific z-levels are defined in datum types, allowing the lists of Z levels to be automatically configured. This solves the problem of being unable to use the z-level #defines in associative lists.
* Converted the example and northern star maps to use the new system.
A simple optimization to can_safely_remove_from_zone() both with and without multi-zas.
Instead of allocating a new list every time we call get_zone_neighbours() (which gets called several times in a loop) we have a pre-built list we don't need to Copy().
Same story for the list to iterate over in can_safely_remove_from_zone()
There should be no semantic change whatsoever from this; it is purely a performance optimization.
This replaces the mystical messages of things like Command Reports, the 'All hands' message when a CD joins, and head announcements with a PA system that behaves more reasonably than pushing all the messages out of the chat box. Nothing about the systems changed, just the way they show up. They still make the sound, too.
Controller with deferrals and SCHECKs to be specific. Won't lag while updating the sun, weather, or temperature.
Also moved some vars around. Namely the planet walls are stored on the planet, not in the weather_holder.
Planets now have their own turfs, the controller 'gives' them to the planets each cycle if there are any unallocated turfs in the global lists, to avoid iterating over other planets' turfs if you have more than one, then cuts the lists if you were crazy and some turf added some invalid type. This saves us type-checking in the for() loops later to make them crunch faster. The former operation should only happen once at the start of the game (and maybe very rarely when turfs are added/removed from a map during the game).
With regards to the temperature updates, rebuilding the zone entirely is an intensive operation. Instead we can use this new cheaty proc to do it from over here. ZAS code outside ZAS oh noooo. Well, the option is to snowflake this case into ZAS which is maybe worse?
Only downside to all this is that if you manually set weather and time it might take between 1-60 seconds for the controller to get around to checking if you wanted to update it. That's not that big a deal. If you really want you can now debug that controller and call doWork on it.
* Instead of open spaces simply showing a static image of the turf below, it shows the turf, all objects, and even moving mobs.
* Controller updates the view to floor below fairly quickly; mobs update in real time.
* Open space can be examined to see how deep it is.
* Mobs are examinable even when on floor below, using a special "zshadow" mob.
* Changes from Eris: Heavily re-written to handle layering, special cases, rewrote controller etc. Shadow mobs don't break entering turfs, etc.
* Update to properly layer the objects from multiple "below" floors in the case of tripple-stacked or more z levels.
* Added constant defines for the planes in use.
* Added open_space.dmi with blank_open icon state for open space's darkening overlay.
Adds a fairly simple system that allows adjusting various numbers like max health, incoming damage, outgoing melee damage, etc. The nice part is that changing certain variables this way (like max health) is a lot safer than manually setting the max health var directly.
Changes a lot of short lines of code to point towards a variable's getter or setter helper instead of reading the var directly so the modifiers can work.
Endoarmor, delayed toxin sting, Enfeebling sting, and recursive adrenaline overdose now use the modifier system.
Enfeebling sting now only lasts two minutes, from five minutes, however it now also reduces the victim's melee damage by 25%/50%, and increases the damage they suffer by 10%/35%, for normal and recursive respectively.
Delayed Toxin Sting's effects are now felt all at once instead of over the course of a few minutes.
Controller with deferrals and SCHECKs to be specific. Won't lag while updating the sun, weather, or temperature.
Also moved some vars around. Namely the planet walls are stored on the planet, not in the weather_holder.
Planets now have their own turfs, the controller 'gives' them to the planets each cycle if there are any unallocated turfs in the global lists, to avoid iterating over other planets' turfs if you have more than one, then cuts the lists if you were crazy and some turf added some invalid type. This saves us type-checking in the for() loops later to make them crunch faster. The former operation should only happen once at the start of the game (and maybe very rarely when turfs are added/removed from a map during the game).
With regards to the temperature updates, rebuilding the zone entirely is an intensive operation. Instead we can use this new cheaty proc to do it from over here. ZAS code outside ZAS oh noooo. Well, the option is to snowflake this case into ZAS which is maybe worse?
Only downside to all this is that if you manually set weather and time it might take between 1-60 seconds for the controller to get around to checking if you wanted to update it. That's not that big a deal. If you really want you can now debug that controller and call doWork on it.
Changes "Species Transformation" to "Replica Transformation" for
clarity, as people were using it and expecting them to change species,
not be a perfect 1:1 replica of the person doing the TF.
Adds "Change_species_and_taur" mode, which does exactly as it says
without making the person appear as a 1:1 replica as the pred TFing them
Adds "Change_hair_and_eyes" tf mode, which allows the changing of the
prey's hair and eye color without having to completely TF them or change
their gender.
Fixes a bug that infinitely drained the pred's nutrition when they used
a TF mode. Slightly increases amount of nutrition the prey gets from the
pred.
The previous client-side optimization made lighting overlays go fully
opaque when it was dark, making it so species darksight didn't let you see
anything. This fixes that by making a dark_soft icon state that has
opacity matching the LIGHTING_SOFT_THRESHOLD.