mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-18 19:39:42 +01:00
cc0a809b4c
This PR adds a feature requested of me by @Fyniiy , adding optional Filters to the Narrate panel that allow Storytellers to narrate only to people that meet a set condition. The conditions themselves were specifically requested to be "Psi Narrates" and "Synth Narrates", with optional variations on Synth narrates that include people with cranial implants. While I was touching these files, I've also fixed the improper message sanitization bug with admin messages in general. <img width="926" height="536" alt="image" src="https://github.com/user-attachments/assets/08dcfd2a-5399-48b0-a13d-2bfd3a2c88f0" /> Here's a breakdown of the filter options. 1. **Skrell-like Psi-sensitives**: Anyone with a Psi-sensitivity score of "At least 1". This will include Skrell, anyone with a Psi-receiver, and people with the High Psi-sensitivity trait. It will exclude people who are blocked from receiving telepathy for any reason, such as having a mindshield, mindblanker, or having the psi-suppression power active. Skrell with the Low Psi-sensitivity trait are counted as "Human-like Psi-sensitives", and so won't be caught by this filter. 2. **Human-like Psi-sensitives**: Anyone who isn't blocked from receiving telepathy, and also has a Psi-sensitivity score of "At least 0". This will basically catch "Most people who aren't a Vaurca, Synthetic, or Diona". It will ignore Humanoids with the Low Psi-sensitivity trait. 3. **Silicons**: Basically all of the possible robots/IPCs. 4. **Silicons + Implants**: It's fairly common practice during Hivebot related events for Storytellers to also include characters with brain implants. This filter automates that by including said brain implant owners in the "Are you a synthetic?" check. 5. **Hivenet**: Pretty simple, people with the Vaurca language. This would be Vaurca, plus anyone with the hivenet implants.
97 lines
3.3 KiB
Plaintext
97 lines
3.3 KiB
Plaintext
#define is_multi_tile_object(atom) (atom.bound_width > world.icon_size || atom.bound_height > world.icon_size)
|
|
|
|
|
|
#define isAI(A) istype(A, /mob/living/silicon/ai)
|
|
#define isDrone(A) istype(A, /mob/living/silicon/robot/drone)
|
|
#define isMatriarchDrone(A) istype(A, /mob/living/silicon/robot/drone/construction/matriarch)
|
|
|
|
#define isalien(A) istype(A, /mob/living/carbon/alien)
|
|
|
|
#define isanimal(A) istype(A, /mob/living/simple_animal)
|
|
|
|
#define isairlock(A) istype(A, /obj/machinery/door/airlock)
|
|
|
|
#define isbrain(A) istype(A, /mob/living/carbon/brain)
|
|
|
|
#define isvirtualmob(A) istype(A, /mob/abstract/ghost/observer/virtual)
|
|
|
|
#define iscarbon(A) istype(A, /mob/living/carbon)
|
|
|
|
#define iscorgi(A) istype(A, /mob/living/simple_animal/corgi)
|
|
|
|
#define isEye(A) istype(A, /mob/abstract/eye)
|
|
|
|
#define ishuman(A) istype(A, /mob/living/carbon/human)
|
|
|
|
#define ismech(A) istype(A, /mob/living/heavy_vehicle)
|
|
|
|
#define isliving(A) istype(A, /mob/living)
|
|
|
|
#define israt(A) istype(A, /mob/living/simple_animal/rat)
|
|
|
|
#define isnewplayer(A) istype(A, /mob/abstract/new_player)
|
|
|
|
#define isobj(A) istype(A, /obj)
|
|
|
|
#define isspace(A) istype(A, /area/space)
|
|
|
|
#define isspaceturf(A) istype(A, /turf/space)
|
|
|
|
#define ischasm(A) (istype(A, /turf/simulated/floor/exoplanet/abyss) || istype(A, /turf/simulated/abyss))
|
|
|
|
#define isghost(A) istype(A, /mob/abstract/ghost)
|
|
|
|
#define isobserver(A) istype(A, /mob/abstract/ghost/observer)
|
|
|
|
#define isstoryteller(A) istype(A, /mob/abstract/ghost/storyteller)
|
|
|
|
#define isabstractmob(A) istype(A, /mob/abstract)
|
|
|
|
#define isorgan(A) istype(A, /obj/item/organ/external)
|
|
|
|
#define ispAI(A) istype(A, /mob/living/silicon/pai)
|
|
|
|
#define isbot(A) istype(A, /mob/living/bot)
|
|
|
|
#define isrobot(A) istype(A, /mob/living/silicon/robot)
|
|
|
|
#define issilicon(A) istype(A, /mob/living/silicon)
|
|
|
|
#define isslime(A) istype(A, /mob/living/carbon/slime)
|
|
|
|
#define iscapacitor(A) istype(A, /obj/item/stock_parts/capacitor)
|
|
|
|
#define ismicrolaser(A) istype(A, /obj/item/stock_parts/micro_laser)
|
|
|
|
#define ismatterbin(A) istype(A, /obj/item/stock_parts/matter_bin)
|
|
|
|
#define isscanner(A) istype(A, /obj/item/stock_parts/scanning_module)
|
|
|
|
#define ismanipulator(A) istype(A, /obj/item/stock_parts/manipulator)
|
|
|
|
#define isclient(A) istype(A, /client)
|
|
|
|
#define isclothing(A) istype(A, /obj/item/clothing)
|
|
#define isaccessory(A) istype(A, /obj/item/clothing/accessory)
|
|
|
|
/// Projectile helpers
|
|
#define isprojectile(A) istype(A, /obj/projectile)
|
|
#define isbeam(A) istype(A, /obj/projectile/beam)
|
|
#define isenergy(A) istype(A, /obj/projectile/energy)
|
|
|
|
#define istransparentturf(A) (HAS_TRAIT(A, TURF_Z_TRANSPARENT_TRAIT))
|
|
|
|
/**
|
|
* A common layered filter pattern for psionics. Helps with reducing the size of guard clauses.
|
|
* Includes every psionic check for RECEIVING starting with the Zona Bovina, and ending with Psi-sensitivity.
|
|
* Set the sensitivity_threshold for your desired minimum Psi-sensitivity to pass.
|
|
* The most common ones you might want are:
|
|
* 2 for "Antag-like".
|
|
* 1 for "Skrell-like".
|
|
* 0 for "Human-like".
|
|
*
|
|
* This one is a define instead of a proc, which gives better code performance.
|
|
* This define is only usable if user is at least an /atom/movable/, such as /mob/
|
|
*/
|
|
#define IS_TELEPATHY_BLOCKED(user, sensitivity_threshold) (!user.has_zona_bovinae() || user.is_psi_blocked() || user.check_psi_sensitivity() < sensitivity_threshold)
|