code:
#define SIGNAL_ADDTRAIT(trait_ref) "addtrait [trait_ref]"
#define SIGNAL_REMOVETRAIT(trait_ref) "removetrait [trait_ref]"

// trait accessor defines
#define ADD_TRAIT(target, trait, source) \
	do { \
		var/list/_L; \
		if (!target.status_traits) { \
			target.status_traits = list(); \
			_L = target.status_traits; \
			_L[trait] = list(source); \
			SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \
		} else { \
			_L = target.status_traits; \
			if (_L[trait]) { \
				_L[trait] |= list(source); \
			} else { \
				_L[trait] = list(source); \
				SEND_SIGNAL(target, SIGNAL_ADDTRAIT(trait), trait); \
			} \
		} \
	} while (0)
#define REMOVE_TRAIT(target, trait, sources) \
	do { \
		var/list/_L = target.status_traits; \
		var/list/_S; \
		if (sources && !islist(sources)) { \
			_S = list(sources); \
		} else { \
			_S = sources\
		}; \
		if (_L?[trait]) { \
			for (var/_T in _L[trait]) { \
				if ((!_S && (_T != ROUNDSTART_TRAIT)) || (_T in _S)) { \
					_L[trait] -= _T \
				} \
			};\
			if (!length(_L[trait])) { \
				_L -= trait; \
				SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \
			}; \
			if (!length(_L)) { \
				target.status_traits = null \
			}; \
		} \
	} while (0)
#define REMOVE_TRAIT_NOT_FROM(target, trait, sources) \
	do { \
		var/list/_traits_list = target.status_traits; \
		var/list/_sources_list; \
		if (sources && !islist(sources)) { \
			_sources_list = list(sources); \
		} else { \
			_sources_list = sources\
		}; \
		if (_traits_list?[trait]) { \
			for (var/_trait_source in _traits_list[trait]) { \
				if (!(_trait_source in _sources_list)) { \
					_traits_list[trait] -= _trait_source \
				} \
			};\
			if (!length(_traits_list[trait])) { \
				_traits_list -= trait; \
				SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(trait), trait); \
			}; \
			if (!length(_traits_list)) { \
				target.status_traits = null \
			}; \
		} \
	} while (0)
#define REMOVE_TRAITS_NOT_IN(target, sources) \
	do { \
		var/list/_L = target.status_traits; \
		var/list/_S = sources; \
		if (_L) { \
			for (var/_T in _L) { \
				_L[_T] &= _S;\
				if (!length(_L[_T])) { \
					_L -= _T; \
					SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T), _T); \
					}; \
				};\
			if (!length(_L)) { \
				target.status_traits = null\
			};\
		}\
	} while (0)

#define REMOVE_TRAITS_IN(target, sources) \
	do { \
		var/list/_L = target.status_traits; \
		var/list/_S = sources; \
		if (sources && !islist(sources)) { \
			_S = list(sources); \
		} else { \
			_S = sources\
		}; \
		if (_L) { \
			for (var/_T in _L) { \
				_L[_T] -= _S;\
				if (!length(_L[_T])) { \
					_L -= _T; \
					SEND_SIGNAL(target, SIGNAL_REMOVETRAIT(_T)); \
					}; \
				};\
			if (!length(_L)) { \
				target.status_traits = null\
			};\
		}\
	} while (0)

#define HAS_TRAIT(target, trait) (target.status_traits?[trait] ? TRUE : FALSE)
#define HAS_TRAIT_FROM(target, trait, source) (target.status_traits?[trait] && (source in target.status_traits[trait]))
#define HAS_TRAIT_FROM_ONLY(target, trait, source) (target.status_traits?[trait] && (source in target.status_traits[trait]) && (length(target.status_traits[trait]) == 1))
#define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits?[trait] && (length(target.status_traits[trait] - source) > 0))

/*
Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits.
*/

//mob traits
/// Forces the user to stay unconscious.
#define TRAIT_KNOCKEDOUT "knockedout"
/// Prevents voluntary movement.
#define TRAIT_IMMOBILIZED "immobilized"
/// Prevents voluntary standing or staying up on its own.
#define TRAIT_FLOORED "floored"
/// Forces user to stay standing
#define TRAIT_FORCED_STANDING "forcedstanding"
/// Prevents usage of manipulation appendages (picking, holding or using items, manipulating storage).
#define TRAIT_HANDS_BLOCKED "handsblocked"
/// Inability to access UI hud elements. Turned into a trait from [MOBILITY_UI] to be able to track sources.
#define TRAIT_UI_BLOCKED "uiblocked"
/// Inability to pull things. Turned into a trait from [MOBILITY_PULL] to be able to track sources.
#define TRAIT_PULL_BLOCKED "pullblocked"
/// Abstract condition that prevents movement if being pulled and might be resisted against. Handcuffs and straight jackets, basically.
#define TRAIT_RESTRAINED "restrained"
/// Doesn't miss attacks
#define TRAIT_PERFECT_ATTACKER "perfect_attacker"
#define TRAIT_INCAPACITATED "incapacitated"
/// In some kind of critical condition. Is able to succumb.
#define TRAIT_CRITICAL_CONDITION "critical-condition"
#define TRAIT_BLIND "blind"
#define TRAIT_MUTE "mute"
#define TRAIT_EMOTEMUTE "emotemute"
#define TRAIT_DEAF "deaf"
#define TRAIT_NEARSIGHT "nearsighted"
#define TRAIT_FAT "fat"
#define TRAIT_HUSK "husk"
#define TRAIT_BADDNA "baddna"
#define TRAIT_CLUMSY "clumsy"
/// means that you can't use weapons with normal trigger guards.
#define TRAIT_CHUNKYFINGERS "chunkyfingers"
#define TRAIT_DUMB "dumb"
/// Whether a mob is dexterous enough to use machines and certain items or not.
#define TRAIT_ADVANCEDTOOLUSER "advancedtooluser"
// Antagonizes the above.
#define TRAIT_DISCOORDINATED_TOOL_USER "discoordinated_tool_user"
#define TRAIT_PACIFISM "pacifism"
#define TRAIT_IGNORESLOWDOWN "ignoreslow"
#define TRAIT_IGNOREDAMAGESLOWDOWN "ignoredamageslowdown"
/// Makes it so the mob can use guns regardless of tool user status
#define TRAIT_GUN_NATURAL "gunnatural"
/// Causes death-like unconsciousness
#define TRAIT_DEATHCOMA "deathcoma"
/// Makes the owner appear as dead to most forms of medical examination
#define TRAIT_FAKEDEATH "fakedeath"
#define TRAIT_DISFIGURED "disfigured"
/// Tracks whether we're gonna be a baby alien's mummy.
#define TRAIT_XENO_HOST "xeno_host"
#define TRAIT_STUNIMMUNE "stun_immunity"
#define TRAIT_STUNRESISTANCE "stun_resistance"
/// Anti Dual-baton cooldown bypass exploit.
#define TRAIT_IWASBATONED "iwasbatoned"
#define TRAIT_SLEEPIMMUNE "sleep_immunity"
#define TRAIT_PUSHIMMUNE "push_immunity"
#define TRAIT_SHOCKIMMUNE "shock_immunity"
#define TRAIT_TESLA_SHOCKIMMUNE "tesla_shock_immunity"
#define TRAIT_STABLEHEART "stable_heart"
/// Prevents you from leaving your corpse
#define TRAIT_CORPSELOCKED "corpselocked"
#define TRAIT_STABLELIVER "stable_liver"
#define TRAIT_VATGROWN "vatgrown"
#define TRAIT_RESISTHEAT "resist_heat"
/// For when you want to be able to touch hot things, but still want fire to be an issue.
#define TRAIT_RESISTHEATHANDS "resist_heat_handsonly"
#define TRAIT_RESISTCOLD "resist_cold"
#define TRAIT_RESISTHIGHPRESSURE "resist_high_pressure"
#define TRAIT_RESISTLOWPRESSURE "resist_low_pressure"
#define TRAIT_BOMBIMMUNE "bomb_immunity"
#define TRAIT_RADIMMUNE "rad_immunity"
#define TRAIT_GENELESS "geneless"
#define TRAIT_VIRUSIMMUNE "virus_immunity"
#define TRAIT_PIERCEIMMUNE "pierce_immunity"
#define TRAIT_NODISMEMBER "dismember_immunity"
#define TRAIT_NOFIRE "nonflammable"
#define TRAIT_NOFIRE_SPREAD "no_fire_spreading"
#define TRAIT_NOGUNS "no_guns"
#define TRAIT_NOHUNGER "no_hunger"
#define TRAIT_NOMETABOLISM "no_metabolism"
#define TRAIT_NOCLONELOSS "no_cloneloss"
#define TRAIT_TOXIMMUNE "toxin_immune"
#define TRAIT_EASYDISMEMBER "easy_dismember"
#define TRAIT_LIMBATTACHMENT "limb_attach"
#define TRAIT_NOLIMBDISABLE "no_limb_disable"
#define TRAIT_EASILY_WOUNDED "easy_limb_wound"
#define TRAIT_HARDLY_WOUNDED "hard_limb_wound"
#define TRAIT_NEVER_WOUNDED "never_wounded"
#define TRAIT_TOXINLOVER "toxinlover"
/// reduces the use time of syringes, pills, patches and medigels but only when using on someone
#define TRAIT_FASTMED "fast_med_use"
#define TRAIT_NOBREATH "no_breath"
#define TRAIT_ANTIMAGIC "anti_magic"
#define TRAIT_HOLY "holy"
#define TRAIT_DEPRESSION "depression"
#define TRAIT_JOLLY "jolly"
#define TRAIT_NOCRITDAMAGE "no_crit"
#define TRAIT_NOSLIPWATER "noslip_water"
#define TRAIT_NOSLIPALL "noslip_all"
#define TRAIT_NODEATH "nodeath"
#define TRAIT_NOHARDCRIT "nohardcrit"
#define TRAIT_NOSOFTCRIT "nosoftcrit"
#define TRAIT_MINDSHIELD "mindshield"
#define TRAIT_DISSECTED "dissected"
/// Can hear observers
#define TRAIT_SIXTHSENSE "sixth_sense"
#define TRAIT_FEARLESS "fearless"
/// These are used for brain-based paralysis, where replacing the limb won't fix it
#define TRAIT_PARALYSIS_L_ARM "para-l-arm"
#define TRAIT_PARALYSIS_R_ARM "para-r-arm"
#define TRAIT_PARALYSIS_L_LEG "para-l-leg"
#define TRAIT_PARALYSIS_R_LEG "para-r-leg"
#define TRAIT_CANNOT_OPEN_PRESENTS "cannot-open-presents"
#define TRAIT_PRESENT_VISION "present-vision"
#define TRAIT_DISK_VERIFIER "disk-verifier"
#define TRAIT_NOMOBSWAP "no-mob-swap"
#define TRAIT_XRAY_VISION "xray_vision"
/// Can weave webs into cloth
#define TRAIT_WEB_WEAVER "web_weaver"
#define TRAIT_THERMAL_VISION "thermal_vision"
#define TRAIT_ABDUCTOR_TRAINING "abductor-training"
#define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training"
#define TRAIT_SURGEON "surgeon"
#define TRAIT_STRONG_GRABBER "strong_grabber"
#define TRAIT_MAGIC_CHOKE "magic_choke"
#define TRAIT_SOOTHED_THROAT "soothed-throat"
#define TRAIT_BOOZE_SLIDER "booze-slider"
/// We place people into a fireman carry quicker than standard
#define TRAIT_QUICK_CARRY "quick-carry"
/// We place people into a fireman carry especially quickly compared to quick_carry
#define TRAIT_QUICKER_CARRY "quicker-carry"
#define TRAIT_QUICK_BUILD "quick-build"
/// We can handle 'dangerous' plants in botany safely
#define TRAIT_PLANT_SAFE "plant_safe"
#define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech"
#define TRAIT_UNSTABLE "unstable"
#define TRAIT_OIL_FRIED "oil_fried"
#define TRAIT_MEDICAL_HUD "med_hud"
#define TRAIT_SECURITY_HUD "sec_hud"
/// for something granting you a diagnostic hud
#define TRAIT_DIAGNOSTIC_HUD "diag_hud"
/// Is a medbot healing you
#define TRAIT_MEDIBOTCOMINGTHROUGH "medbot"
#define TRAIT_PASSTABLE "passtable"
/// Makes you immune to flashes
#define TRAIT_NOFLASH "noflash"
/// prevents xeno huggies implanting skeletons
#define TRAIT_XENO_IMMUNE "xeno_immune"
/// Makes you flashable from any direction
#define TRAIT_FLASH_SENSITIVE "flash_sensitive"
#define TRAIT_NAIVE "naive"
#define TRAIT_PRIMITIVE "primitive"
#define TRAIT_GUNFLIP "gunflip"
/// Increases chance of getting special traumas, makes them harder to cure
#define TRAIT_SPECIAL_TRAUMA_BOOST "special_trauma_boost"
#define TRAIT_BLOODCRAWL_EAT "bloodcrawl_eat"
#define TRAIT_SPACEWALK "spacewalk"
/// Gets double arcade prizes
#define TRAIT_GAMERGOD "gamer-god"
#define TRAIT_GIANT "giant"
#define TRAIT_DWARF "dwarf"
/// makes your footsteps completely silent
#define TRAIT_SILENT_FOOTSTEPS "silent_footsteps"
/// hnnnnnnnggggg..... you're pretty good....
#define TRAIT_NICE_SHOT "nice_shot"
/// prevents the damage done by a brain tumor
#define TRAIT_TUMOR_SUPPRESSED "brain_tumor_suppressed"
/// overrides the update_fire proc to always add fire (for lava)
#define TRAIT_PERMANENTLY_ONFIRE "permanently_onfire"
/// Galactic Common Sign Language
#define TRAIT_SIGN_LANG "sign_language"
/// nobody can use martial arts on this mob
#define TRAIT_MARTIAL_ARTS_IMMUNE "martial_arts_immune"
/// You've been cursed with a living duffelbag, and can't have more added
#define TRAIT_DUFFEL_CURSE_PROOF "duffel_cursed"
/// Revenants draining you only get a very small benefit.
#define TRAIT_WEAK_SOUL "weak_soul"
/// Prevents mob from riding mobs when buckled onto something
#define TRAIT_CANT_RIDE "cant_ride"
/// from heparin, makes open bleeding wounds rapidly spill more blood
#define TRAIT_BLOODY_MESS "bloody_mess"
/// from coagulant reagents, this doesn't affect the bleeding itself but does affect the bleed warning messages
#define TRAIT_COAGULATING "coagulating"
/// From anti-convulsant medication against seizures.
#define TRAIT_ANTICONVULSANT "anticonvulsant"
/// The holder of this trait has antennae or whatever that hurt a ton when noogied
#define TRAIT_ANTENNAE "antennae"
/// Blowing kisses actually does damage to the victim
#define TRAIT_KISS_OF_DEATH "kiss_of_death"
/// Used to activate french kissing
#define TRAIT_GARLIC_BREATH "kiss_of_garlic_death"
/// Used on limbs in the process of turning a human into a plasmaman while in plasma lava
#define TRAIT_PLASMABURNT "plasma_burnt"
/// Addictions don't tick down, basically they're permanently addicted
#define TRAIT_HOPELESSLY_ADDICTED "hopelessly_addicted"
/// Their eyes glow an unnatural red colour. Currently used to set special examine text on humans. Does not guarantee the mob's eyes are coloured red, nor that there is any visible glow on their character sprite.
#define TRAIT_UNNATURAL_RED_GLOWY_EYES "unnatural_red_glowy_eyes"
/// Their eyes are bloodshot. Currently used to set special examine text on humans. Examine text is overridden by TRAIT_UNNATURAL_RED_GLOWY_EYES.
#define TRAIT_BLOODSHOT_EYES "bloodshot_eyes"
/// This mob should never close UI even if it doesn't have a client
#define TRAIT_PRESERVE_UI_WITHOUT_CLIENT "preserve_ui_without_client"
/// Lets the mob use flight potions
#define TRAIT_CAN_USE_FLIGHT_POTION "can_use_flight_potion"
/// This mob overrides certian SSlag_switch measures with this special trait
#define TRAIT_BYPASS_MEASURES "bypass_lagswitch_measures"
/// Someone can safely be attacked with honorbound with ONLY a combat mode check, the trait is assuring holding a weapon and hitting won't hurt them..
#define TRAIT_ALLOWED_HONORBOUND_ATTACK "allowed_honorbound_attack"
/// The user is sparring
#define TRAIT_SPARRING "sparring"

#define TRAIT_NOBLEED "nobleed" //This carbon doesn't bleed
/// This atom can ignore the "is on a turf" check for simple AI datum attacks, allowing them to attack from bags or lockers as long as any other conditions are met
#define TRAIT_AI_BAGATTACK "bagattack"
/// This mobs bodyparts are invisible but still clickable.
#define TRAIT_INVISIBLE_MAN "invisible_man"
/// Don't draw external organs/species features like wings, horns, frills and stuff
#define TRAIT_HIDE_EXTERNAL_ORGANS "hide_external_organs"
///When people are floating from zero-grav or something, we can move around freely!
#define TRAIT_FREE_FLOAT_MOVEMENT "free_float_movement"
// You can stare into the abyss, but it does not stare back.
// You're immune to the hallucination effect of the supermatter, either
// through force of will, or equipment. Present on /mob or /datum/mind
#define TRAIT_SUPERMATTER_MADNESS_IMMUNE "supermatter_madness_immune"

// You can stare into the abyss, and it turns pink.
// Being close enough to the supermatter makes it heal at higher temperatures
// and emit less heat. Present on /mob or /datum/mind
#define TRAIT_SUPERMATTER_SOOTHER "supermatter_soother"
/*
* Trait granted by various security jobs, and checked by [/obj/item/food/donut]
* When present in the mob's mind, they will always love donuts.
*/
#define TRAIT_DONUT_LOVER "donut_lover"

/// `do_teleport` will not allow this atom to teleport
#define TRAIT_NO_TELEPORT "no-teleport"

/// Trait used by fugu glands to avoid double buffing
#define TRAIT_FUGU_GLANDED "fugu_glanded"

/// Trait applied to [/datum/mind] to stop someone from using the cursed hot springs to polymorph more than once.
#define TRAIT_HOT_SPRING_CURSED "hot_spring_cursed"

/// If something has been engraved/cannot be engraved
#define TRAIT_NOT_ENGRAVABLE "not_engravable"

// METABOLISMS
// Various jobs on the station have historically had better reactions
// to various drinks and foodstuffs. Security liking donuts is a classic
// example. Through years of training/abuse, their livers have taken
// a liking to those substances. Steal a sec officer's liver, eat donuts good.

// These traits are applied to /obj/item/organ/liver
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law_enforcement_metabolism"
#define TRAIT_CULINARY_METABOLISM "culinary_metabolism"
#define TRAIT_COMEDY_METABOLISM "comedy_metabolism"
#define TRAIT_MEDICAL_METABOLISM "medical_metabolism"
#define TRAIT_GREYTIDE_METABOLISM "greytide_metabolism"
#define TRAIT_ENGINEER_METABOLISM "engineer_metabolism"
#define TRAIT_ROYAL_METABOLISM "royal_metabolism"
#define TRAIT_PRETENDER_ROYAL_METABOLISM "pretender_royal_metabolism"

/// This mob can strip other mobs.
#define TRAIT_CAN_STRIP "can_strip"

// If present on a mob or mobmind, allows them to "suplex" an immovable rod
// turning it into a glorified potted plant, and giving them an
// achievement. Can also be used on rod-form wizards.
// Normally only present in the mind of a Research Director.
#define TRAIT_ROD_SUPLEX "rod_suplex"

//SKILLS
#define TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE "underwater_basketweaving"
#define TRAIT_WINE_TASTER "wine_taster"
#define TRAIT_BONSAI "bonsai"
#define TRAIT_LIGHTBULB_REMOVER "lightbulb_remover"
#define TRAIT_KNOW_CYBORG_WIRES "know_cyborg_wires"
#define TRAIT_KNOW_ENGI_WIRES "know_engi_wires"
#define TRAIT_ENTRAILS_READER "entrails_reader"
/// this skillchip trait lets you wash brains in washing machines to heal them
#define TRAIT_BRAINWASHING "brainwashing"

///Movement type traits for movables. See elements/movetype_handler.dm
#define TRAIT_MOVE_GROUND "move_ground"
#define TRAIT_MOVE_FLYING "move_flying"
#define TRAIT_MOVE_VENTCRAWLING "move_ventcrawling"
#define TRAIT_MOVE_FLOATING "move_floating"
#define TRAIT_MOVE_PHASING "move_phasing"
/// Disables the floating animation. See above.
#define TRAIT_NO_FLOATING_ANIM "no-floating-animation"

/// Weather immunities, also protect mobs inside them.
#define TRAIT_LAVA_IMMUNE "lava_immune" //Used by lava turfs and The Floor Is Lava.
#define TRAIT_ASHSTORM_IMMUNE "ashstorm_immune"
#define TRAIT_SNOWSTORM_IMMUNE "snowstorm_immune"
#define TRAIT_RADSTORM_IMMUNE "radstorm_immune"
#define TRAIT_VOIDSTORM_IMMUNE "voidstorm_immune"
#define TRAIT_WEATHER_IMMUNE "weather_immune" //Immune to ALL weather effects.

//non-mob traits
/// Used for limb-based paralysis, where replacing the limb will fix it.
#define TRAIT_PARALYSIS "paralysis"
/// Used for limbs.
#define TRAIT_DISABLED_BY_WOUND "disabled-by-wound"

/*
 * Used for movables that need to be updated, via COMSIG_ENTER_AREA and COMSIG_EXIT_AREA, when transitioning areas.
 * Use [/atom/movable/proc/become_area_sensitive(trait_source)] to properly enable it. How you remove it isn't as important.
 */
#define TRAIT_AREA_SENSITIVE "area-sensitive"

#define TRAIT_HEARING_SENSITIVE "hearing_sensitive"

/// Climbable trait, given and taken by the climbable element when added or removed. Exists to be easily checked via HAS_TRAIT().
#define TRAIT_CLIMBABLE "trait_climbable"

/// Used by the honkspam element to avoid spamming the sound. Amusing considering its name.
#define TRAIT_HONKSPAMMING "trait_honkspamming"

///Used for managing KEEP_TOGETHER in [/atom/var/appearance_flags]
#define TRAIT_KEEP_TOGETHER "keep-together"

///Marks the item as having been transmuted. Functionally blacklists the item from being recycled or sold for materials.
#define TRAIT_MAT_TRANSMUTED "transmuted"

///If the item will block the cargo shuttle from flying to centcom
#define TRAIT_BANNED_FROM_CARGO_SHUTTLE "banned_from_cargo_shuttle"

// item traits
#define TRAIT_NODROP "nodrop"
/// cannot be inserted in a storage.
#define TRAIT_NO_STORAGE_INSERT "no_storage_insert"
/// Visible on t-ray scanners if the atom/var/level == 1
#define TRAIT_T_RAY_VISIBLE "t-ray-visible"
#define TRAIT_FOOD_GRILLED "food_grilled"
/// The items needs two hands to be carried
#define TRAIT_NEEDS_TWO_HANDS "needstwohands"
/// Can't be catched when thrown
#define TRAIT_UNCATCHABLE "uncatchable"
/// Fish in this won't die
#define TRAIT_FISH_SAFE_STORAGE "fish_case"
/// Stuff that can go inside fish cases
#define TRAIT_FISH_CASE_COMPATIBILE "fish_case_compatibile"
/// Plants that were mutated as a result of passive instability, not a mutation threshold.
#define TRAIT_PLANT_WILDMUTATE "wildmutation"
/// If you hit an APC with exposed internals with this item it will try to shock you
#define TRAIT_APC_SHOCKING "apc_shocking"
/// Properly wielded two handed item
#define TRAIT_WIELDED "wielded"
/// Buckling yourself to objects with this trait won't immobilize you
#define TRAIT_NO_IMMOBILIZE "no_immobilize"

//quirk traits
#define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance"
#define TRAIT_AGEUSIA "ageusia"
#define TRAIT_HEAVY_SLEEPER "heavy_sleeper"
#define TRAIT_NIGHT_VISION "night_vision"
#define TRAIT_LIGHT_STEP "light_step"
#define TRAIT_SPIRITUAL "spiritual"
#define TRAIT_CLOWN_ENJOYER "clown_enjoyer"
#define TRAIT_MIME_FAN "mime_fan"
#define TRAIT_VORACIOUS "voracious"
#define TRAIT_SELF_AWARE "self_aware"
#define TRAIT_FREERUNNING "freerunning"
#define TRAIT_SKITTISH "skittish"
#define TRAIT_POOR_AIM "poor_aim"
#define TRAIT_PROSOPAGNOSIA "prosopagnosia"
#define TRAIT_TAGGER "tagger"
#define TRAIT_PHOTOGRAPHER "photographer"
#define TRAIT_MUSICIAN "musician"
#define TRAIT_LIGHT_DRINKER "light_drinker"
#define TRAIT_EMPATH "empath"
#define TRAIT_FRIENDLY "friendly"
#define TRAIT_GRABWEAKNESS "grab_weakness"
#define TRAIT_SNOB "snob"
#define TRAIT_BALD "bald"
#define TRAIT_BADTOUCH "bad_touch"
#define TRAIT_EXTROVERT "extrovert"
#define TRAIT_INTROVERT "introvert"
#define TRAIT_ANXIOUS "anxious"
#define TRAIT_INSANITY "insanity"
/// Gives you the Shifty Eyes quirk, rarely making people who examine you think you examined them back even when you didn't
#define TRAIT_SHIFTY_EYES "shifty_eyes"

///Trait for dryable items
#define TRAIT_DRYABLE "trait_dryable"
///Trait for dried items
#define TRAIT_DRIED "trait_dried"
/// Trait for customizable reagent holder
#define TRAIT_CUSTOMIZABLE_REAGENT_HOLDER "customizable_reagent_holder"

/* Traits for ventcrawling.
 * Both give access to ventcrawling, but *_NUDE requires the user to be
 * wearing no clothes and holding no items. If both present, *_ALWAYS
 * takes precedence.
 */
#define TRAIT_VENTCRAWLER_ALWAYS "ventcrawler_always"
#define TRAIT_VENTCRAWLER_NUDE "ventcrawler_nude"

/// Minor trait used for beakers, or beaker-ishes. [/obj/item/reagent_containers], to show that they've been used in a reagent grinder.
#define TRAIT_MAY_CONTAIN_BLENDED_DUST "may_contain_blended_dust"

/// Trait put on [/mob/living/carbon/human]. If that mob has a crystal core, also known as an ethereal heart, it will not try to revive them if the mob dies.
#define TRAIT_CANNOT_CRYSTALIZE "cannot_crystalize"

///Trait applied to turfs when an atmos holosign is placed on them. It will stop firedoors from closing.
#define TRAIT_FIREDOOR_STOP "firedoor_stop"

/// Trait applied when the MMI component is added to an [/obj/item/integrated_circuit]
#define TRAIT_COMPONENT_MMI "component_mmi"
/// Trait applied when the MMI component is added to an [/obj/item/integrated_circuit]
#define TRAIT_COMPONENT_PRINTER "component_printer"

/// If present on a [/mob/living/carbon], will make them appear to have a medium level disease on health HUDs.
#define TRAIT_DISEASELIKE_SEVERITY_MEDIUM "diseaselike_severity_medium"

/// trait denoting someone will crawl faster in soft crit
#define TRAIT_TENACIOUS "tenacious"

/// trait denoting someone will sometimes recover out of crit
#define TRAIT_UNBREAKABLE "unbreakable"

//Medical Categories for quirks
#define CAT_QUIRK_ALL 0
#define CAT_QUIRK_NOTES 1
#define CAT_QUIRK_MINOR_DISABILITY 2
#define CAT_QUIRK_MAJOR_DISABILITY 3

// common trait sources
#define TRAIT_GENERIC "generic"
#define UNCONSCIOUS_TRAIT "unconscious"
#define EYE_DAMAGE "eye_damage"
#define EAR_DAMAGE "ear_damage"
#define GENETIC_MUTATION "genetic"
#define OBESITY "obesity"
#define MAGIC_TRAIT "magic"
#define TRAUMA_TRAIT "trauma"
#define FLIGHTPOTION_TRAIT "flightpotion"
/// Trait inherited by experimental surgeries
#define EXPERIMENTAL_SURGERY_TRAIT "experimental_surgery"
#define DISEASE_TRAIT "disease"
#define SPECIES_TRAIT "species"
#define ORGAN_TRAIT "organ"
/// cannot be removed without admin intervention
#define ROUNDSTART_TRAIT "roundstart"
#define JOB_TRAIT "job"
#define CYBORG_ITEM_TRAIT "cyborg-item"
/// Any traits granted by quirks.
#define QUIRK_TRAIT "quirk_trait"
/// (B)admins only.
#define ADMIN_TRAIT "admin"
#define CHANGELING_TRAIT "changeling"
#define CULT_TRAIT "cult"
/// The item is magically cursed
#define CURSED_ITEM_TRAIT(item_type) "cursed_item_[item_type]"
#define ABSTRACT_ITEM_TRAIT "abstract-item"
#define STATUS_EFFECT_TRAIT "status-effect"
#define CLOTHING_TRAIT "clothing"
#define HELMET_TRAIT "helmet"
/// inherited from the mask
#define MASK_TRAIT "mask"
/// inherited from your sweet kicks
#define SHOES_TRAIT "shoes"
/// Trait inherited by implants
#define IMPLANT_TRAIT "implant"
#define GLASSES_TRAIT "glasses"
/// inherited from riding vehicles
#define VEHICLE_TRAIT "vehicle"
#define INNATE_TRAIT "innate"
#define CRIT_HEALTH_TRAIT "crit_health"
#define OXYLOSS_TRAIT "oxyloss"
#define TURF_TRAIT "turf"
/// trait associated to being buckled
#define BUCKLED_TRAIT "buckled"
/// trait associated to being held in a chokehold
#define CHOKEHOLD_TRAIT "chokehold"
/// trait associated to resting
#define RESTING_TRAIT "resting"
/// trait associated to a stat value or range of
#define STAT_TRAIT "stat"
#define STATION_TRAIT "station-trait"
/// obtained from mapping helper
#define MAPPING_HELPER_TRAIT "mapping-helper"
/// Trait associated to wearing a suit
#define SUIT_TRAIT "suit"
/// Trait associated to lying down (having a [lying_angle] of a different value than zero).
#define LYING_DOWN_TRAIT "lying-down"
/// Trait associated to lacking electrical power.
#define POWER_LACK_TRAIT "power-lack"
/// Trait associated to lacking motor movement
#define MOTOR_LACK_TRAIT "motor-lack"
/// Trait associated with mafia
#define MAFIA_TRAIT "mafia"
/// Trait associated with highlander
#define HIGHLANDER_TRAIT "highlander"

///generic atom traits
/// Trait from [/datum/element/rust]. Its rusty and should be applying a special overlay to denote this.
#define TRAIT_RUSTY "rust_trait"
///stops someone from splashing their reagent_container on an object with this trait
#define DO_NOT_SPLASH "do_not_splash"

// unique trait sources, still defines
#define CLONING_POD_TRAIT "cloning-pod"
#define STATUE_MUTE "statue"
#define CHANGELING_DRAIN "drain"
#define ABYSSAL_GAZE_BLIND "abyssal_gaze"
#define HIGHLANDER "highlander"
#define TRAIT_HULK "hulk"
#define STASIS_MUTE "stasis"
#define GENETICS_SPELL "genetics_spell"
#define EYES_COVERED "eyes_covered"
#define HYPNOCHAIR_TRAIT "hypnochair"
#define FLASHLIGHT_EYES "flashlight_eyes"
#define IMPURE_OCULINE "impure_oculine"
#define BLINDFOLD_TRAIT "blindfolded"
#define TRAIT_SANTA "santa"
#define SCRYING_ORB "scrying-orb"
#define ABDUCTOR_ANTAGONIST "abductor-antagonist"
#define JUNGLE_FEVER_TRAIT "jungle_fever"
#define MEGAFAUNA_TRAIT "megafauna"
#define CLOWN_NUKE_TRAIT "clown-nuke"
#define STICKY_MOUSTACHE_TRAIT "sticky-moustache"
#define CHAINSAW_FRENZY_TRAIT "chainsaw-frenzy"
#define CHRONO_GUN_TRAIT "chrono-gun"
#define REVERSE_BEAR_TRAP_TRAIT "reverse-bear-trap"
#define CURSED_MASK_TRAIT "cursed-mask"
#define HIS_GRACE_TRAIT "his-grace"
#define HAND_REPLACEMENT_TRAIT "magic-hand"
#define HOT_POTATO_TRAIT "hot-potato"
#define SABRE_SUICIDE_TRAIT "sabre-suicide"
#define ABDUCTOR_VEST_TRAIT "abductor-vest"
#define CAPTURE_THE_FLAG_TRAIT "capture-the-flag"
#define EYE_OF_GOD_TRAIT "eye-of-god"
#define SHAMEBRERO_TRAIT "shamebrero"
#define CHRONOSUIT_TRAIT "chronosuit"
#define LOCKED_HELMET_TRAIT "locked-helmet"
#define NINJA_SUIT_TRAIT "ninja-suit"
#define SLEEPING_CARP_TRAIT "sleeping_carp"
#define MADE_UNCLONEABLE "made-uncloneable"
#define TIMESTOP_TRAIT "timestop"
#define LIFECANDLE_TRAIT "lifecandle"
#define VENTCRAWLING_TRAIT "ventcrawling"
#define SPECIES_FLIGHT_TRAIT "species-flight"
#define FROSTMINER_ENRAGE_TRAIT "frostminer-enrage"
#define NO_GRAVITY_TRAIT "no-gravity"
#define LEAPING_TRAIT "leaping"
#define LEAPER_BUBBLE_TRAIT "leaper-bubble"
/// sticky nodrop sounds like a bad soundcloud rapper's name
#define STICKY_NODROP "sticky-nodrop"
#define SKILLCHIP_TRAIT "skillchip"
#define BUSY_FLOORBOT_TRAIT "busy-floorbot"
#define PULLED_WHILE_SOFTCRIT_TRAIT "pulled-while-softcrit"
#define LOCKED_BORG_TRAIT "locked-borg"
/// trait associated to not having locomotion appendages nor the ability to fly or float
#define LACKING_LOCOMOTION_APPENDAGES_TRAIT "lacking-locomotion-appengades"
#define CRYO_TRAIT "cryo"
/// trait associated to not having fine manipulation appendages such as hands
#define LACKING_MANIPULATION_APPENDAGES_TRAIT "lacking-manipulation-appengades"
#define HANDCUFFED_TRAIT "handcuffed"
/// Trait granted by [/obj/item/warpwhistle]
#define WARPWHISTLE_TRAIT "warpwhistle"
///Turf trait for when a turf is transparent
#define TURF_Z_TRANSPARENT_TRAIT "turf_z_transparent"
/// Trait applied by [/datum/component/soulstoned]
#define SOULSTONE_TRAIT "soulstone"
/// Trait applied to slimes by low temperature
#define SLIME_COLD "slime-cold"
/// Trait applied to mobs by being tipped over
#define TIPPED_OVER "tipped-over"
/// Trait applied to PAIs by being folded
#define PAI_FOLDED "pai-folded"
/// Trait applied to brain mobs when they lack external aid for locomotion, such as being inside a mech.
#define BRAIN_UNAIDED "brain-unaided"
/// Trait applied by element
#define ELEMENT_TRAIT "element_trait"
/// Trait granted by [/obj/item/clothing/head/helmet/space/hardsuit/berserker]
#define BERSERK_TRAIT "berserk_trait"
/// Trait granted by [/obj/item/rod_of_asclepius]
#define HIPPOCRATIC_OATH_TRAIT "hippocratic_oath"
/// Trait granted by [/datum/status_effect/blooddrunk]
#define BLOODDRUNK_TRAIT "blooddrunk"
/// Trait granted by lipstick
#define LIPSTICK_TRAIT "lipstick_trait"
/// Self-explainatory.
#define BEAUTY_ELEMENT_TRAIT "beauty_element"
#define MOOD_COMPONENT_TRAIT "mood_component"
#define DRONE_SHY_TRAIT "drone_shy"
/// Pacifism trait given by stabilized light pink extracts.
#define STABILIZED_LIGHT_PINK_TRAIT "stabilized_light_pink"

/**
* Trait granted by [/mob/living/carbon/Initialize] and
* granted/removed by [/obj/item/organ/tongue]
* Used for ensuring that carbons without tongues cannot taste anything
* so it is added in Initialize, and then removed when a tongue is inserted
* and readded when a tongue is removed.
*/
#define NO_TONGUE_TRAIT "no_tongue_trait"

/// Trait granted by [/mob/living/silicon/robot]
/// Traits applied to a silicon mob by their model.
#define MODEL_TRAIT "model_trait"

/// Trait granted by [mob/living/silicon/ai]
/// Applied when the ai anchors itself
#define AI_ANCHOR_TRAIT "ai_anchor"
/// Trait from [/datum/antagonist/nukeop/clownop]
#define CLOWNOP_TRAIT "clownop"

///Traits given by station traits
#define STATION_TRAIT_BANANIUM_SHIPMENTS "station_trait_bananium_shipments"
#define STATION_TRAIT_UNNATURAL_ATMOSPHERE "station_trait_unnatural_atmosphere"
#define STATION_TRAIT_UNIQUE_AI "station_trait_unique_ai"
#define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation"
#define STATION_TRAIT_PREMIUM_INTERNALS "station_trait_premium_internals"
#define STATION_TRAIT_LATE_ARRIVALS "station_trait_late_arrivals"
#define STATION_TRAIT_RANDOM_ARRIVALS "station_trait_random_arrivals"
#define STATION_TRAIT_HANGOVER "station_trait_hangover"
#define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint"
#define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint"
#define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched"

/// ID cards with this trait will attempt to forcibly occupy the front-facing ID card slot in wallets.
#define TRAIT_MAGNETIC_ID_CARD "magnetic_id_card"
/// Traits granted to items due to their chameleon properties.
#define CHAMELEON_ITEM_TRAIT "chameleon_item_trait"

/// This human wants to see the color of their glasses, for some reason
#define TRAIT_SEE_GLASS_COLORS "see_glass_colors"


code:
#define CHANGETURF_DEFER_CHANGE 1
#define CHANGETURF_IGNORE_AIR 2 // This flag prevents changeturf from gathering air from nearby turfs to fill the new turf with an approximation of local air
#define CHANGETURF_FORCEOP 4
#define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE
#define CHANGETURF_INHERIT_AIR 16 // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR
#define CHANGETURF_RECALC_ADJACENT 32 //Immediately recalc adjacent atmos turfs instead of queuing.

#define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS)

//supposedly the fastest way to do this according to https://gist.github.com/Giacom/be635398926bb463b42a
///Returns a list of turf in a square
#define RANGE_TURFS(RADIUS, CENTER) \
	RECT_TURFS(RADIUS, RADIUS, CENTER)

#define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \
	block( \
	locate(max(CENTER.x-(H_RADIUS),1),          max(CENTER.y-(V_RADIUS),1),          CENTER.z), \
	locate(min(CENTER.x+(H_RADIUS),world.maxx), min(CENTER.y+(V_RADIUS),world.maxy), CENTER.z) \
	)

///Returns all turfs in a zlevel
#define Z_TURFS(ZLEVEL) block(locate(1,1,ZLEVEL), locate(world.maxx, world.maxy, ZLEVEL))

#define TURF_FROM_COORDS_LIST(List) (locate(List[1], List[2], List[3]))

repo_name: AnalWerewolf/sundown

license: mit


code:
//Byond type ids
#define TYPEID_NULL "0"
#define TYPEID_NORMAL_LIST "f"
//helper macros
#define GET_TYPEID(ref) ( ( (length(ref) <= 10) ? "TYPEID_NULL" : copytext(ref, 4, -7) ) )
#define IS_NORMAL_LIST(L) (GET_TYPEID("\ref[L]") == TYPEID_NORMAL_LIST)


code:
// These are used in uplink_devices.dm to determine whether or not an item is purchasable.

/// This item is purchasable to traitors
#define UPLINK_TRAITORS (1 << 0)

/// This item is purchasable to nuke ops
#define UPLINK_NUKE_OPS (1 << 1)

/// This item is purchasable to clown ops
#define UPLINK_CLOWN_OPS (1 << 2)


code:
//Vehicle control flags. control flags describe access to actions in a vehicle.

///controls the vehicles movement
#define VEHICLE_CONTROL_DRIVE (1<<0)
///Can't leave vehicle voluntarily, has to resist.
#define VEHICLE_CONTROL_KIDNAPPED (1<<1)
///melee attacks/shoves a vehicle may have
#define VEHICLE_CONTROL_MELEE (1<<2)
///using equipment/weapons on the vehicle
#define VEHICLE_CONTROL_EQUIPMENT (1<<3)
///changing around settings and the like.
#define VEHICLE_CONTROL_SETTINGS (1<<4)

///ez define for giving a single pilot mech all the flags it needs.
#define FULL_MECHA_CONTROL ALL

//Ridden vehicle flags

/// Does our vehicle require arms to operate? Also used for piggybacking on humans to reserve arms on the rider
#define RIDER_NEEDS_ARMS   (1<<0)
// As above but only used for riding cyborgs, and only reserves 1 arm instead of 2
#define RIDER_NEEDS_ARM (1<<1)
/// Do we need legs to ride this (checks against TRAIT_FLOORED)
#define RIDER_NEEDS_LEGS   (1<<2)
/// If the rider is disabled or loses their needed limbs, do they fall off?
#define UNBUCKLE_DISABLED_RIDER (1<<3)
// For fireman carries, the carrying human needs an arm
#define CARRIER_NEEDS_ARM (1<<4)

//car_traits flags
///Will this car kidnap people by ramming into them?
#define CAN_KIDNAP (1<<0)

#define CLOWN_CANNON_INACTIVE 0
#define CLOWN_CANNON_BUSY 1
#define CLOWN_CANNON_READY 2

//Vim defines
///cooldown between uses of the sound maker
#define VIM_SOUND_COOLDOWN 1 SECONDS
///how much vim heals per weld
#define VIM_HEAL_AMOUNT 20


code:
#define VV_NUM "Number"
#define VV_TEXT "Text"
#define VV_MESSAGE "Mutiline Text"
#define VV_COLOR "Color"
#define VV_ICON "Icon"
#define VV_ATOM_REFERENCE "Atom Reference"
#define VV_DATUM_REFERENCE "Datum Reference"
#define VV_MOB_REFERENCE "Mob Reference"
#define VV_CLIENT "Client"
#define VV_ATOM_TYPE "Atom Typepath"
#define VV_DATUM_TYPE "Datum Typepath"
#define VV_TYPE "Custom Typepath"
#define VV_FILE "File"
#define VV_LIST "List"
#define VV_NEW_ATOM "New Atom"
#define VV_NEW_DATUM "New Datum"
#define VV_NEW_TYPE "New Custom Typepath"
#define VV_NEW_LIST "New List"
#define VV_NULL "NULL"
#define VV_INFINITY "Infinity"
#define VV_RESTORE_DEFAULT "Restore to Default"
#define VV_MARKED_DATUM "Marked Datum"
#define VV_BITFIELD "Bitfield"
#define VV_TEXT_LOCATE "Custom Reference Locate"
#define VV_PROCCALL_RETVAL "Return Value of Proccall"

#define VV_MSG_MARKED "
Marked Object"
#define VV_MSG_EDITED "
Var Edited"
#define VV_MSG_DELETED "
Deleted"

#define VV_NORMAL_LIST_NO_EXPAND_THRESHOLD 50
#define VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD 150

//#define IS_VALID_ASSOC_KEY(V) (istext(V) || ispath(V) || isdatum(V) || islist(V))
#define IS_VALID_ASSOC_KEY(V) (!isnum(V)) //hhmmm..

//General helpers
#define VV_HREF_TARGET_INTERNAL(target, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[REF(target)]"
#define VV_HREF_TARGETREF_INTERNAL(targetref, href_key) "?_src_=vars;[HrefToken()];[href_key]=TRUE;[VV_HK_TARGET]=[targetref]"
#define VV_HREF_TARGET(target, href_key, text) "[text]"
#define VV_HREF_TARGETREF(targetref, href_key, text) "[text]"
#define VV_HREF_TARGET_1V(target, href_key, text, varname) "[text]" //for stuff like basic varedits, one variable
#define VV_HREF_TARGETREF_1V(targetref, href_key, text, varname) "[text]"

#define GET_VV_TARGET locate(href_list[VV_HK_TARGET])
#define GET_VV_VAR_TARGET href_list[VV_HK_VARNAME]

//Helper for getting something to vv_do_topic in general
#define VV_TOPIC_LINK(datum, href_key, text) "text"

//Helpers for vv_get_dropdown()
#define VV_DROPDOWN_OPTION(href_key, name) . += "<option value='?_src_=vars;[HrefToken()];[href_key]=TRUE;target=[REF(src)]'>[name]</option>"

// VV HREF KEYS
#define VV_HK_TARGET "target"
#define VV_HK_VARNAME "targetvar" //name or index of var for 1 variable targetting hrefs.

// vv_do_list() keys
#define VV_HK_LIST_ADD "listadd"
#define VV_HK_LIST_EDIT "listedit"
#define VV_HK_LIST_CHANGE "listchange"
#define VV_HK_LIST_REMOVE "listremove"
#define VV_HK_LIST_ERASE_NULLS "listnulls"
#define VV_HK_LIST_ERASE_DUPES "listdupes"
#define VV_HK_LIST_SHUFFLE "listshuffle"
#define VV_HK_LIST_SET_LENGTH "listlen"

// vv_do_basic() keys
#define VV_HK_BASIC_EDIT "datumedit"
#define VV_HK_BASIC_CHANGE "datumchange"
#define VV_HK_BASIC_MASSEDIT "massedit"

// /datum
#define VV_HK_DELETE "delete"
#define VV_HK_EXPOSE "expose"
#define VV_HK_CALLPROC "proc_call"
#define VV_HK_MARK "mark"
#define VV_HK_ADDCOMPONENT "addcomponent"
#define VV_HK_REMOVECOMPONENT "removecomponent"
#define VV_HK_MASS_REMOVECOMPONENT "massremovecomponent"
#define VV_HK_MODIFY_TRAITS "modtraits"

// /atom
#define VV_HK_MODIFY_TRANSFORM "atom_transform"
#define VV_HK_MODIFY_GREYSCALE "modify_greyscale"
#define VV_HK_ADD_REAGENT "addreagent"
#define VV_HK_SHOW_HIDDENPRINTS "show_hiddenprints"
#define VV_HK_TRIGGER_EMP "empulse"
#define VV_HK_TRIGGER_EXPLOSION "explode"
#define VV_HK_AUTO_RENAME "auto_rename"
#define VV_HK_RADIATE "radiate"
#define VV_HK_EDIT_FILTERS "edit_filters"
#define VV_HK_ADD_AI "add_ai"

// /atom/movable
#define VV_HK_DEADCHAT_PLAYS "deadchat_plays"

// /obj
#define VV_HK_OSAY "osay"
#define VV_HK_MASS_DEL_TYPE "mass_delete_type"
#define VV_HK_ARMOR_MOD "mod_obj_armor"

// /obj/item
#define VV_HK_ADD_FANTASY_AFFIX "add_fantasy_affix"

// /mob
#define VV_HK_GIB "gib"
#define VV_HK_GIVE_SPELL "give_spell"
#define VV_HK_REMOVE_SPELL "remove_spell"
#define VV_HK_GIVE_DISEASE "give_disease"
#define VV_HK_GODMODE "godmode"
#define VV_HK_DROP_ALL "dropall"
#define VV_HK_REGEN_ICONS "regen_icons"
#define VV_HK_PLAYER_PANEL "player_panel"
#define VV_HK_BUILDMODE "buildmode"
#define VV_HK_DIRECT_CONTROL "direct_control"
#define VV_HK_GIVE_DIRECT_CONTROL "give_direct_control"
#define VV_HK_OFFER_GHOSTS "offer_ghosts"
#define VV_HK_SDQL_SPELL "sdql_spell"

// /mob/living/carbon
#define VV_HK_MAKE_AI "aiify"
#define VV_HK_MODIFY_BODYPART "mod_bodypart"
#define VV_HK_MODIFY_ORGANS "organs_modify"
#define VV_HK_HALLUCINATION "force_hallucinate"
#define VV_HK_MARTIAL_ART "give_martial_art"
#define VV_HK_GIVE_TRAUMA "give_trauma"
#define VV_HK_CURE_TRAUMA "cure_trauma"

// /mob/living/carbon/human
#define VV_HK_COPY_OUTFIT "copy_outfit"
#define VV_HK_MOD_MUTATIONS "quirkmut"
#define VV_HK_MOD_QUIRKS "quirkmod"
#define VV_HK_MAKE_MONKEY "human_monkify"
#define VV_HK_MAKE_CYBORG "human_cyborgify"
#define VV_HK_MAKE_SLIME "human_slimeify"
#define VV_HK_MAKE_ALIEN "human_alienify"
#define VV_HK_SET_SPECIES "setspecies"
#define VV_HK_PURRBATION "purrbation"

// misc
#define VV_HK_SPACEVINE_PURGE "spacevine_purge"

// paintings
#define VV_HK_REMOVE_PAINTING "remove_painting"

//outfits
#define VV_HK_TO_OUTFIT_EDITOR "outfit_editor"

// /obj/effect/proc_holder/spell
/// Require casting_clothes to cast spell.
#define VV_HK_SPELL_SET_ROBELESS "spell_set_robeless"
/// Require cult armor to cast spell.
#define VV_HK_SPELL_SET_CULT "spell_set_cult"
/// Require the mob to be ishuman() to cast spell.
#define VV_HK_SPELL_SET_HUMANONLY "spell_set_humanonly"
/// Require mob to not be a brain or pAI to cast spell.
#define VV_HK_SPELL_SET_NONABSTRACT "spell_set_nonabstract"
/// Spell can now be cast without casting_clothes.
#define VV_HK_SPELL_UNSET_ROBELESS "spell_unset_robeless"
/// Spell can now be cast without cult armour.
#define VV_HK_SPELL_UNSET_CULT "spell_unset_cult"
/// Any /mob can cast this spell.
#define VV_HK_SPELL_UNSET_HUMANONLY "spell_unset_humanonly"
/// Abstract mobs such as brains or pAIs can cast this spell.
#define VV_HK_SPELL_UNSET_NONABSTRACT "spell_unset_nonabstract"


code:
#define WALL_DENT_HIT 1
#define WALL_DENT_SHOT 2


code:
//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)


code:
/// Helper define that can only be used in /obj/item/circuit_component/input_received()
#define COMPONENT_TRIGGERED_BY(trigger, port) (trigger.value && trigger == port)

/// Define to be placed at any proc that is triggered by a port.
#define CIRCUIT_TRIGGER SHOULD_NOT_SLEEP(TRUE)

// Port defines

#define PORT_MAX_NAME_LENGTH 50

// Port types. Determines what the port can connect to

/// Can accept any datatype. Only works for inputs, output types will runtime.
#define PORT_TYPE_ANY "any"

// Fundamental datatypes
/// String datatype
#define PORT_TYPE_STRING "string"
#define PORT_MAX_STRING_LENGTH 5000
#define PORT_MAX_STRING_DISPLAY 100
/// Number datatype
#define PORT_TYPE_NUMBER "number"
/// Signal datatype
#define PORT_TYPE_SIGNAL "signal"
/// Signal datatype, with a slight variation in name to suggest it causes instant execution. Can only be an output port.
#define PORT_TYPE_INSTANT_SIGNAL "instant signal"
/// Signal datatype, with a slight variation in name to suggest that it can be used to respond to instant execution.
#define PORT_TYPE_RESPONSE_SIGNAL "response signal"
/// Table datatype. Derivative of list, contains other lists with matching columns.
#define PORT_TYPE_TABLE "table"
/// Options datatype. Derivative of string.
#define PORT_TYPE_OPTION "option"

// Composite datatypes
#define PORT_COMPOSITE_TYPE_LIST "list"
/// List datatype
#define PORT_TYPE_LIST(datatype) SSwiremod_composite.composite_datatype(PORT_COMPOSITE_TYPE_LIST, datatype)

#define PORT_COMPOSITE_TYPE_ASSOC_LIST "assoc list"
/// Associative List datatype. Derivative of list.
#define PORT_TYPE_ASSOC_LIST(key_datatype, datatype) SSwiremod_composite.composite_datatype(PORT_COMPOSITE_TYPE_ASSOC_LIST, key_datatype, datatype)

// Other datatypes
/// Atom datatype
#define PORT_TYPE_ATOM "entity"
/// Datum datatype
#define PORT_TYPE_DATUM "datum"

/// The maximum range between a port and an atom
#define PORT_ATOM_MAX_RANGE 7

#define COMPONENT_DEFAULT_NAME "component"

/// The minimum position of the x and y co-ordinates of the component in the UI
#define COMPONENT_MIN_RANDOM_POS 200
/// The maximum position of the x and y co-ordinates of the component in the UI
#define COMPONENT_MAX_RANDOM_POS 400

/// The maximum position in both directions that a component can be in.
/// Prevents someone from positioning a component at an absurdly high value.
#define COMPONENT_MAX_POS 10000

// Components

/// The value that is sent whenever a component is simply sending a signal. This can be anything, and is currently the seconds since roundstart.
#define COMPONENT_SIGNAL (world.time / (1 SECONDS))

// Comparison defines
#define COMP_COMPARISON_EQUAL "="
#define COMP_COMPARISON_NOT_EQUAL "!="
#define COMP_COMPARISON_GREATER_THAN ">"
#define COMP_COMPARISON_LESS_THAN "<"
#define COMP_COMPARISON_GREATER_THAN_OR_EQUAL ">="
#define COMP_COMPARISON_LESS_THAN_OR_EQUAL "<="

// Clock component
#define COMP_CLOCK_DELAY 0.9 SECONDS

// Shells

/// Whether a circuit is stuck on a shell and cannot be removed (by a user)
#define SHELL_FLAG_CIRCUIT_FIXED (1<<0)

/// Whether the shell needs to be anchored for the circuit to be on.
#define SHELL_FLAG_REQUIRE_ANCHOR (1<<1)

/// Whether or not the shell has a USB port.
#define SHELL_FLAG_USB_PORT (1<<2)

/// Whether the shell allows actions to be peformed on a shell if the action fails. This will additionally block the messages from being displayed.
#define SHELL_FLAG_ALLOW_FAILURE_ACTION (1<<3)

// Shell capacities. These can be converted to configs very easily later
#define SHELL_CAPACITY_SMALL 25
#define SHELL_CAPACITY_MEDIUM 50
#define SHELL_CAPACITY_LARGE 100
#define SHELL_CAPACITY_VERY_LARGE 500

/// The maximum range a USB cable can be apart from a source
#define USB_CABLE_MAX_RANGE 2

// Circuit flags
/// Creates an input trigger that means the component won't be triggered unless the trigger is pulsed.
#define CIRCUIT_FLAG_INPUT_SIGNAL (1<<0)
/// Creates an output trigger that sends a pulse whenever the component is successfully triggered
#define CIRCUIT_FLAG_OUTPUT_SIGNAL (1<<1)
/// Prohibits the component from being duplicated via the module duplicator
#define CIRCUIT_FLAG_UNDUPEABLE (1<<2)
/// Marks a circuit component as admin only. Admins will only be able to link/unlink with these circuit components.
#define CIRCUIT_FLAG_ADMIN (1<<3)
/// This circuit component does not show in the menu.
#define CIRCUIT_FLAG_HIDDEN (1<<4)
/// This circuit component has been marked as a component that has instant execution and will show up in the UI as so. This will only cause a visual change.
#define CIRCUIT_FLAG_INSTANT (1<<5)
/// This circuit component can't be loaded in module component. Saves us some headaches.
#define CIRCUIT_FLAG_REFUSE_MODULE (1<<6)

// Datatype flags
/// The datatype supports manual inputs
#define DATATYPE_FLAG_ALLOW_MANUAL_INPUT (1<<0)
/// The datatype won't update the value when it is connected to the port
#define DATATYPE_FLAG_AVOID_VALUE_UPDATE (1<<1)
/// Allows the datatype to take entity values from the circuit multitool.
#define DATATYPE_FLAG_ALLOW_ATOM_INPUT (1<<2)
/// The datatype has been generated and is an existing composite datatype
#define DATATYPE_FLAG_COMPOSITE (1<<3)


code:
//retvals for attempt_wires_interaction
#define WIRE_INTERACTION_FAIL 0
#define WIRE_INTERACTION_SUCCESSFUL 1
#define WIRE_INTERACTION_BLOCK 2 //don't do anything else rather than open wires and whatever else.

#define WIRE_DUD_PREFIX "__dud"
#define WIRE_ACTIVATE "Activate"
#define WIRE_AI "AI Connection"
#define WIRE_ALARM "Alarm"
#define WIRE_AVOIDANCE "Avoidance"
#define WIRE_BACKUP1 "Auxiliary Power 1"
#define WIRE_BACKUP2 "Auxiliary Power 2"
#define WIRE_BEACON "Beacon"
#define WIRE_BOLTS "Bolts"
#define WIRE_BOOM "Boom"
#define WIRE_CAMERA "Camera"
#define WIRE_CONTRABAND "Contraband"
#define WIRE_DELAY "Delay"
#define WIRE_DISABLE "Disable"
#define WIRE_DISARM "Disarm"
#define WIRE_HACK "Hack"
#define WIRE_IDSCAN "ID Scan"
#define WIRE_INTERFACE "Interface"
#define WIRE_LAWSYNC "AI Law Synchronization"
#define WIRE_LIGHT "Bolt Lights"
#define WIRE_LIMIT "Limiter"
#define WIRE_LOADCHECK "Load Check"
#define WIRE_LOCKDOWN "Lockdown"
#define WIRE_MOTOR1 "Motor 1"
#define WIRE_MOTOR2 "Motor 2"
#define WIRE_OPEN "Open"
#define WIRE_PANIC "Panic Siphon"
#define WIRE_POWER "Power"
#define WIRE_POWER1 "Main Power 1"
#define WIRE_POWER2 "Main Power 2"
#define WIRE_PROCEED "Proceed"
#define WIRE_RX "Receive"
#define WIRE_RESET_MODEL "Reset Model"
#define WIRE_SAFETY "Safety"
#define WIRE_SHOCK "High Voltage Ground"
#define WIRE_SIGNAL "Signal"
#define WIRE_SPEAKER "Speaker"
#define WIRE_STRENGTH "Strength"
#define WIRE_THROW "Throw"
#define WIRE_TIMING "Timing"
#define WIRE_TX "Transmit"
#define WIRE_UNBOLT "Unbolt"
#define WIRE_ZAP "High Voltage Circuit"
#define WIRE_ZAP1 "High Voltage Circuit 1"
#define WIRE_ZAP2 "High Voltage Circuit 2"
#define WIRE_PRIZEVEND "Emergency Prize Vend"
#define WIRE_RESETOWNER "Reset Owner"
#define WIRE_AGELIMIT "Age Limit"
#define WIRE_ACCEPT "Scan Success"
#define WIRE_DENY "Scan Fail"


code:
/* SEPTIC EDIT REMOVAL
// ~wound damage/rolling defines
/// the cornerstone of the wound threshold system, your base wound roll for any attack is rand(1, damage^this), after armor reduces said damage. See [/obj/item/bodypart/proc/check_wounding]
#define WOUND_DAMAGE_EXPONENT 1.4
/// any damage dealt over this is ignored for damage rolls unless the target has the frail quirk (35^1.4=145, for reference)
#define WOUND_MAX_CONSIDERED_DAMAGE 35
/// an attack must do this much damage after armor in order to roll for being a wound (so pressure damage/being on fire doesn't proc it)
#define WOUND_MINIMUM_DAMAGE 5
/// an attack must do this much damage after armor in order to be eliigible to dismember a suitably mushed bodypart
#define DISMEMBER_MINIMUM_DAMAGE 10
/// If an attack rolls this high with their wound (including mods), we try to outright dismember the limb. Note 250 is high enough that with a perfect max roll of 145 (see max cons'd damage), you'd need +100 in mods to do this
#define WOUND_DISMEMBER_OUTRIGHT_THRESH 250
/// set wound_bonus on an item or attack to this to disable checking wounding for the attack
#define CANT_WOUND -100

// ~wound severities
/// for jokey/meme wounds like stubbed toe, no standard messages/sounds or second winds
#define WOUND_SEVERITY_TRIVIAL 0
#define WOUND_SEVERITY_MODERATE 1
#define WOUND_SEVERITY_SEVERE 2
#define WOUND_SEVERITY_CRITICAL 3
/// outright dismemberment of limb
#define WOUND_SEVERITY_LOSS 4

// ~wound categories
/// any brute weapon/attack that doesn't have sharpness. rolls for blunt bone wounds
#define WOUND_BLUNT 1
/// any brute weapon/attack with sharpness = SHARP_EDGED. rolls for slash wounds
#define WOUND_SLASH 2
/// any brute weapon/attack with sharpness = SHARP_POINTY. rolls for piercing wounds
#define WOUND_PIERCE 3
/// any concentrated burn attack (lasers really). rolls for burning wounds
#define WOUND_BURN 4

// ~determination second wind defines
// How much determination reagent to add each time someone gains a new wound in [/datum/wound/proc/second_wind]
#define WOUND_DETERMINATION_MODERATE 1
#define WOUND_DETERMINATION_SEVERE 2.5
#define WOUND_DETERMINATION_CRITICAL 5
#define WOUND_DETERMINATION_LOSS 7.5
/// the max amount of determination you can have
#define WOUND_DETERMINATION_MAX 10

/// While someone has determination in their system, their bleed rate is slightly reduced
#define WOUND_DETERMINATION_BLEED_MOD 0.85

// ~wound global lists
// list in order of highest severity to lowest
GLOBAL_LIST_INIT(global_wound_types, list(WOUND_BLUNT = list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate),
		WOUND_SLASH = list(/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate),
		WOUND_PIERCE = list(/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate),
		WOUND_BURN = list(/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate)
		))

// every single type of wound that can be rolled naturally, in case you need to pull a random one
GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datum/wound/blunt/severe, /datum/wound/blunt/moderate,
	/datum/wound/slash/critical, /datum/wound/slash/severe, /datum/wound/slash/moderate,
	/datum/wound/pierce/critical, /datum/wound/pierce/severe, /datum/wound/pierce/moderate,
	/datum/wound/burn/critical, /datum/wound/burn/severe, /datum/wound/burn/moderate))

// ~burn wound infection defines
// Thresholds for infection for burn wounds, once infestation hits each threshold, things get steadily worse
/// below this has no ill effects from infection
#define WOUND_INFECTION_MODERATE 4
/// then below here, you ooze some pus and suffer minor tox damage, but nothing serious
#define WOUND_INFECTION_SEVERE 8
/// then below here, your limb occasionally locks up from damage and infection and briefly becomes disabled. Things are getting really bad
#define WOUND_INFECTION_CRITICAL 12
/// below here, your skin is almost entirely falling off and your limb locks up more frequently. You are within a stone's throw of septic paralysis and losing the limb
#define WOUND_INFECTION_SEPTIC 20
// above WOUND_INFECTION_SEPTIC, your limb is completely putrid and you start rolling to lose the entire limb by way of paralyzation. After 3 failed rolls (~4-5% each probably), the limb is paralyzed

// ~random wound balance defines
/// how quickly sanitization removes infestation and decays per second
#define WOUND_BURN_SANITIZATION_RATE 0.075
/// how much blood you can lose per second per slash max. 4 is a LOT of blood for one cut so don't worry about hitting it easily
#define WOUND_SLASH_MAX_BLOODFLOW 4
/// dead people don't bleed, but they can clot! this is the minimum amount of clotting per tick on dead people, so even critical cuts will slowly clot in dead people
#define WOUND_SLASH_DEAD_CLOT_MIN 0.025
/// if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100)
#define WOUND_BONE_HEAD_TIME_VARIANCE 20

// ~mangling defines
// With the wounds pt. 2 update, general dismemberment now requires 2 things for a limb to be dismemberable (bone only creatures just need the second):
// 1. Skin is mangled: A critical slash or pierce wound on that limb
// 2. Bone is mangled: At least a severe bone wound on that limb
// see [/obj/item/bodypart/proc/get_mangled_state] for more information
#define BODYPART_MANGLED_NONE 0
#define BODYPART_MANGLED_BONE 1
#define BODYPART_MANGLED_FLESH 2
#define BODYPART_MANGLED_BOTH 3

// ~biology defines
// What kind of biology we have, and what wounds we can suffer, mostly relies on the HAS_FLESH and HAS_BONE species traits on human species
/// golems and androids, cannot suffer any wounds
#define BIO_INORGANIC 0
/// skeletons and plasmemes, can only suffer bone wounds, only needs mangled bone to be able to dismember
#define BIO_JUST_BONE 1
/// nothing right now, maybe slimepeople in the future, can only suffer slashing, piercing, and burn wounds
#define BIO_JUST_FLESH 2
/// standard humanoids, can suffer all wounds, needs mangled bone and flesh to dismember. conveniently, what you get when you combine BIO_JUST_BONE and BIO_JUST_FLESH
#define BIO_FLESH_BONE 3

// ~wound flag defines
/// If this wound requires having the HAS_FLESH flag for humanoids
#define FLESH_WOUND (1<<0)
/// If this wound requires having the HAS_BONE flag for humanaoids
#define BONE_WOUND (1<<1)
/// If having this wound counts as mangled flesh for dismemberment
#define MANGLES_FLESH (1<<2)
/// If having this wound counts as mangled bone for dismemberment
#define MANGLES_BONE (1<<3)
/// If this wound marks the limb as being allowed to have gauze applied
#define ACCEPTS_GAUZE (1<<4)

// ~scar persistence defines
// The following are the order placements for persistent scar save formats
/// The version number of the scar we're saving, any scars being loaded below this number will be discarded, see SCAR_CURRENT_VERSION below
#define SCAR_SAVE_VERS 1
/// The body_zone we're applying to on granting
#define SCAR_SAVE_ZONE 2
/// The description we're loading
#define SCAR_SAVE_DESC 3
/// The precise location we're loading
#define SCAR_SAVE_PRECISE_LOCATION 4
/// The severity the scar had
#define SCAR_SAVE_SEVERITY 5
/// Whether this is a BIO_JUST_BONE scar, a BIO_JUST_FLESH scar, or a BIO_FLESH_BONE scar (so you can't load fleshy human scars on a plasmaman character)
#define SCAR_SAVE_BIOLOGY 6
/// Which character slot this was saved to
#define SCAR_SAVE_CHAR_SLOT 7
///how many fields we save for each scar (so the number of above fields)
#define SCAR_SAVE_LENGTH 7

/// saved scars with a version lower than this will be discarded, increment when you update the persistent scarring format in a way that invalidates previous saved scars (new fields, reordering, etc)
#define SCAR_CURRENT_VERSION 3
/// how many scar slots, per character slot, we have to cycle through for persistent scarring, if enabled in character prefs
#define PERSISTENT_SCAR_SLOTS 3

// ~blood_flow rates of change, these are used by [/datum/wound/proc/get_bleed_rate_of_change] from [/mob/living/carbon/proc/bleed_warn] to let the player know if their bleeding is getting better/worse/the same
/// Our wound is clotting and will eventually stop bleeding if this continues
#define BLOOD_FLOW_DECREASING -1
/// Our wound is bleeding but is holding steady at the same rate.
#define BLOOD_FLOW_STEADY 0
/// Our wound is bleeding and actively getting worse, like if we're a critical slash or if we're afflicted with heparin
#define BLOOD_FLOW_INCREASING 1

/// How often can we annoy the player about their bleeding? This duration is extended if it's not serious bleeding
#define BLEEDING_MESSAGE_BASE_CD 10 SECONDS

/// Skeletons and other BIO_ONLY_BONE creatures respond much better to bone gel and can have severe and critical bone wounds healed by bone gel alone. The duration it takes to heal is also multiplied by this, lucky them!
#define WOUND_BONE_BIO_BONE_GEL_MULT 0.25
*/


code:
#define DNA_BLOCK_SIZE 6

#define DNA_HAIRSTYLE_BLOCK 1
#define DNA_HAIR_COLOR_BLOCK 2
#define DNA_FACIAL_HAIRSTYLE_BLOCK 3
#define DNA_FACIAL_HAIR_COLOR_BLOCK 4
#define DNA_LEFT_EYE_COLOR_BLOCK 5
#define DNA_RIGHT_EYE_COLOR_BLOCK 6
#define DNA_GENDER_BLOCK 7
#define DNA_SKIN_TONE_BLOCK 8

#define DNA_UNI_IDENTITY_BLOCKS 8

#define DNA_LIZARD_MARKINGS_BLOCK 1
#define DNA_LIZARD_TAIL_BLOCK 2
#define DNA_MONKEY_TAIL_BLOCK 3
#define DNA_HUMAN_TAIL_BLOCK 4
#define DNA_WINGS_BLOCK 5
#define DNA_MOTH_WINGS_BLOCK 6
#define DNA_MOTH_ANTENNAE_BLOCK 7
#define DNA_SNOUT_BLOCK 8
#define DNA_HORNS_BLOCK 9
#define DNA_FRILLS_BLOCK 10
#define DNA_SPINES_BLOCK 11
#define DNA_EARS_BLOCK 12
#define DNA_MUSHROOM_CAPS_BLOCK 13

#define DNA_FEATURE_BLOCKS 13

#define DNA_MUTANT_COLOR_BLOCK 1
#define DNA_MUTANT_COLOR_2_BLOCK 2
#define DNA_MUTANT_COLOR_3_BLOCK 3
#define DNA_ETHEREAL_COLOR_BLOCK 4
#define DNA_SKIN_COLOR_BLOCK 5

#define DNA_MANDATORY_COLOR_BLOCKS 5

#define DNA_BLOCKS_PER_FEATURE 4
#define DNA_BLOCKS_PER_MARKING 2
#define DNA_BLOCKS_PER_MARKING_ZONE (1+(MAXIMUM_MARKINGS_PER_LIMB*DNA_BLOCKS_PER_MARKING))

// ~species traits
// we start from 28 to not interfere with TG species defines, should they add more
// We're using all three mutcolor features for our skin coloration
#define MUTCOLOR_MATRIXED 28
#define MUTCOLORS2 29
#define MUTCOLORS3 30
// Defines for whether an accessory should have one or three colors to choose for
#define USE_ONE_COLOR 31
#define USE_MATRIXED_COLORS	32
// Defines for robotic species
#define REVIVES_BY_HEALING 33
#define ROBOTIC_LIMBS 34
#define ROBOTIC_ORGANS 35
#define NOPAIN 36
#define NOHEART 37
#define NOLUNGS 38
#define NOLIVER 39
#define NOKIDNEYS 40
#define NOSPLEEN 41
#define NOINTESTINES 42
#define NOBLADDER 43
#define NOHORNY 44

#define MANDATORY_FEATURE_LIST list("mcolor" = "FFFFBB",\
								"mcolor2" = "FFFFBB",\
								"mcolor3" = "FFFFBB",\
								"ethcolor" = "FFCCCC",\
								"skin_color" = "FFEEDD",\
								"breasts_size" = BREASTS_DEFAULT_SIZE,\
								"breasts_lactation" = BREASTS_DEFAULT_LACTATION,\
								"penis_size" = PENIS_DEFAULT_LENGTH,\
								"penis_girth" = PENIS_DEFAULT_GIRTH,\
								"penis_taur_mode" = FALSE,\
								"penis_sheath" = SHEATH_NONE,\
								"balls_size" = BALLS_DEFAULT_SIZE,\
								"body_size" = BODY_SIZE_NORMAL,\
								"uses_skintones" = FALSE)

#define RANDOM_FEATURE_LIST list("mcolor" = "FFFFBB",\
								"mcolor2" = "FFFFBB",\
								"mcolor3" = "FFFFBB",\
								"ethcolor" = "FFCCCC",\
								"skin_color" = "FFEEDD",\
								"breasts_size" = BREASTS_DEFAULT_SIZE,\
								"breasts_lactation" = BREASTS_DEFAULT_LACTATION,\
								"penis_size" = PENIS_DEFAULT_LENGTH,\
								"penis_girth" = PENIS_DEFAULT_GIRTH,\
								"penis_taur_mode" = FALSE,\
								"penis_sheath" = SHEATH_NONE,\
								"balls_size" = BALLS_DEFAULT_SIZE,\
								"body_size" = BODY_SIZE_NORMAL,\
								"uses_skintones" = FALSE)

#define SPECIES_HUMANOID "humanoid"
#define SPECIES_SKRELL "skrell"
#define SPECIES_WEREWOLF "werewolf"
#define SPECIES_WERECAT "werecat"
#define SPECIES_MAMMAL "mammal"
#define SPECIES_AQUATIC "aquatic"
#define SPECIES_INSECT "insect"
#define SPECIES_SYNTHMAMMAL "synthmammal"
#define SPECIES_SYNTHLIZARD "synthlizard"
#define SPECIES_SYNTHHUMAN "synthhuman"
#define SPECIES_IPC "ipc"


code:
//safe codes
#define CODE_SYRINGE_GUN 1


code:
// Some defines for sprite accessories
// Which color source we're using when the accessory is added
#define DEFAULT_PRIMARY 1	//Uses primary color
#define DEFAULT_SECONDARY 2 //Uses secondary color
#define DEFAULT_TERTIARY 3	//Uses tertiary color
#define DEFAULT_MATRIXED 4 //Uses all three colors for a matrix
#define DEFAULT_SKIN_OR_PRIMARY	5 //Uses skin tone color if the character uses one, otherwise primary color

// Defines for extra bits of accessories
#define COLOR_SRC_PRIMARY 1
#define COLOR_SRC_SECONDARY	2
#define COLOR_SRC_TERTIARY 3
#define COLOR_SRC_MATRIXED 4

// Defines for mutant bodyparts indexes
#define MUTANT_INDEX_NAME "name"
#define MUTANT_INDEX_COLOR "color"

// The color list that is passed to color matrixed things when a person is husked
#define HUSK_COLOR_LIST list(list(0.64, 0.64, 0.64, 0), list(0.64, 0.64, 0.64, 0), list(0.64, 0.64, 0.64, 0), list(0, 0, 0, 1))

// Defines for an accessory to be randomed
#define ACC_RANDOM "random"

// Maximum amount of markings a single limb may have
#define MAXIMUM_MARKINGS_PER_LIMB 5

// Preview types
#define PREVIEW_PREF_JOB "Job"
#define PREVIEW_PREF_NAKED "Naked"
#define PREVIEW_PREF_NAKED_AROUSED "Aroused"

// Body size defines
#define BODY_SIZE_NORMAL 1
#define BODY_SIZE_MAX 1
#define BODY_SIZE_MIN 1

// Underwear visibility
#define UNDERWEAR_HIDE_SOCKS (1<<0)
#define UNDERWEAR_HIDE_SHIRT (1<<1)
#define UNDERWEAR_HIDE_UNDIES (1<<2)


code:
#define NONDOMINANT_HAND_ACTIONSPEED 0.35
#define AMBIDEXTROUS_HAND_ACTIONSPEED 0.2
#define SHOCK_STAGE_ACTIONSPEED 0.25
#define LIMB_EFFICIENCY_ACTIONSPEED_MULTIPLIER 1


code:
// ~ATMOS MIX IDS
///Default atmos of Nevado, generally around -15 celsius
#define NEVADO_SURFACE_DEFAULT_ATMOS "NEVADO_SURFACE_ATMOS"
///Cave atmos of Nevado, generally around 0 celsius
#define NEVADO_CAVES_DEFAULT_ATMOS "NEVADO_CAVES_ATMOS"


code:
#define GET_MOB_ATTRIBUTE_VALUE_RAW(mob, attribute_path) mob.attributes?.raw_attribute_list[attribute_path]
#define GET_MOB_ATTRIBUTE_VALUE(mob, attribute_path) mob.attributes?.attribute_list[attribute_path]
#define GET_ATTRIBUTE_DATUM(path) GLOB.all_attributes[path]

// ~attribute/stat values
#define ATTRIBUTE_MIN 0
#define ATTRIBUTE_MAX 40

#define ATTRIBUTE_MIDDLING 10
#define ATTRIBUTE_MASTER 20

#define ATTRIBUTE_DEFAULT ATTRIBUTE_MIDDLING

#define SKILL_MIN 0
#define SKILL_MAX 40

#define SKILL_MIDDLING 10
#define SKILL_MASTER 20

#define SKILL_DEFAULT SKILL_MIN

// ~diceroll results
#define DICE_CRIT_SUCCESS 2
#define DICE_SUCCESS 1
#define DICE_FAILURE 0
#define DICE_CRIT_FAILURE -1

// ~skill categories
#define SKILL_CATEGORY_GENERAL "General Skills"
#define SKILL_CATEGORY_COMBAT "Combat Skills"
#define SKILL_CATEGORY_SKULLDUGGERY "Skullduggery Skills"
#define SKILL_CATEGORY_MEDICAL "Medical Skills"
#define SKILL_CATEGORY_RESEARCH "Research Skills"
#define SKILL_CATEGORY_ENGINEERING "Engineering Skills"
#define SKILL_CATEGORY_DOMESTIC "Domestic Skills"
#define SKILL_CATEGORY_DUMB "Stupid Skills"

// ~path defines
#define STAT_STRENGTH /datum/attribute/stat/strength
#define STAT_DEXTERITY /datum/attribute/stat/dexterity
#define STAT_ENDURANCE /datum/attribute/stat/endurance
#define STAT_INTELLIGENCE /datum/attribute/stat/intelligence

// ~combat skills
#define SKILL_MELEE /datum/attribute/skill/melee
#define SKILL_RANGED /datum/attribute/skill/ranged
#define SKILL_THROWING /datum/attribute/skill/throwing
#define SKILL_TRACKING /datum/attribute/skill/tracking

// ~skullduggery skills
#define SKILL_PICKPOCKET /datum/attribute/skill/pickpocket
#define SKILL_LOCKPICKING /datum/attribute/skill/lockpicking

// ~medical skills
#define SKILL_MEDICINE /datum/attribute/skill/medicine
#define SKILL_SURGERY /datum/attribute/skill/surgery

// ~engineering skills
#define SKILL_MASONRY /datum/attribute/skill/masonry
#define SKILL_SMITHING /datum/attribute/skill/smithing
#define SKILL_ELECTRONICS /datum/attribute/skill/electronics
#define SKILL_CLIMBING /datum/attribute/skill/climbing

// ~research skills
#define SKILL_SCIENCE /datum/attribute/skill/science
#define SKILL_CHEMISTRY /datum/attribute/skill/chemistry

// ~domestic skills
#define SKILL_COOKING /datum/attribute/skill/culinary
#define SKILL_BOTANY /datum/attribute/skill/agriculture
#define SKILL_CLEANING /datum/attribute/skill/cleaning

// ~dumb skills
#define SKILL_GAMING /datum/attribute/skill/gaming


code:
//ALL OF THESE DEFINES NEED TO BE UNIQUE!!!

//Categories
#define AUGMENT_CATEGORY_NONE "No Category"
#define AUGMENT_CATEGORY_LIMBS "Limbs"
#define AUGMENT_CATEGORY_ORGANS	"Organs"
#define AUGMENT_CATEGORY_IMPLANTS "Implants"

//Slots
#define AUGMENT_SLOT_NONE "No Slot"

#define AUGMENT_SLOT_R_EYESOCKET "Right Eyesocket"
#define AUGMENT_SLOT_L_EYESOCKET "Left Eyesocket"
#define AUGMENT_SLOT_HEAD "Head"
#define AUGMENT_SLOT_FACE "Face"
#define AUGMENT_SLOT_MOUTH "Jaw"
#define AUGMENT_SLOT_NECK "Throat"
#define AUGMENT_SLOT_CHEST "Upper Body"
#define AUGMENT_SLOT_GROIN "Lower Body"
#define AUGMENT_SLOT_L_ARM "Left Arm"
#define AUGMENT_SLOT_R_ARM "Right Arm"
#define AUGMENT_SLOT_L_HAND	"Left Hand"
#define AUGMENT_SLOT_R_HAND "Right Hand"
#define AUGMENT_SLOT_L_LEG "Left Leg"
#define AUGMENT_SLOT_R_LEG "Right Leg"
#define AUGMENT_SLOT_L_FOOT	"Left Foot"
#define AUGMENT_SLOT_R_FOOT "Right Foot"

#define AUGMENT_SLOT_HEART "Heart"
#define AUGMENT_SLOT_LUNGS "Lungs"
#define AUGMENT_SLOT_LIVER "Liver"
#define AUGMENT_SLOT_STOMACH "Stomach"
#define AUGMENT_SLOT_EYES "Eyes"
#define AUGMENT_SLOT_TONGUE	"Tongue"

#define AUGMENT_SLOT_BRAIN_IMPLANT "Brain Implant"
#define AUGMENT_SLOT_CHEST_IMPLANT "Chest Implant"
#define AUGMENT_SLOT_LEFT_ARM_IMPLANT "Left Arm Implant"
#define AUGMENT_SLOT_RIGHT_ARM_IMPLANT "Right Arm Implant"
#define AUGMENT_SLOT_EYE_IMPLANT "Eye Implant"
#define AUGMENT_SLOT_MOUTH_IMPLANT "Mouth Implant"


code:
//for convenience
#define ENABLE_BITFIELD(variable, flag) (variable |= (flag))
#define DISABLE_BITFIELD(variable, flag) (variable &= ~(flag))
#define CHECK_BITFIELD(variable, flag) (variable & (flag))
#define TOGGLE_BITFIELD(variable, flag) (variable ^= (flag))

#define COPY_SPECIFIC_BITFIELDS(a,b,flags)\
	do{\
		var/_old = a & ~(flags);\
		var/_cleaned = b & (flags);\
		a = _old | _cleaned;\
	} while(0);

#define CHECK_MULTIPLE_BITFIELDS(flagvar, flags) (((flagvar) & (flags)) == (flags))


code:
// ~general blood related stuff
#define TOTAL_BLOOD_REQ_DEFAULT 224
#define ALBINO_BLOOD_REDUCTION 150

#define GET_EFFECTIVE_BLOOD_VOL(num, total_blood_req) (max(num - DEFAULT_TOTAL_BLOOD_REQ + total_blood_req, 0))

//Bloody shoe blood states
#define BLOOD_STATE_SHIT "shit"
#define BLOOD_STATE_CUM "cum"
#define BLOOD_STATE_FEMCUM "femcum"


code:
// ~bodypart icons
#define DEFAULT_BODYPART_ICON 'modular_septic/icons/mob/human/species/human/dismembered_human_parts.dmi'
#define DEFAULT_BODYPART_ICON_ORGANIC 'modular_septic/icons/mob/human/species/human/new_human_parts.dmi'
#define DEFAULT_BODYPART_ICON_ROBOTIC 'modular_septic/icons/mob/human/augments/augments.dmi'
#define DEFAULT_BODYPART_ICON_ANIMAL 'modular_septic/icons/mob/carbon/animal_parts.dmi'

// ~bodypart damage messages
#define DEFAULT_NO_BRUTE_MSG "unbruised"
#define DEFAULT_LIGHT_BRUTE_MSG "bruised"
#define DEFAULT_MEDIUM_BRUTE_MSG "battered"
#define DEFAULT_HEAVY_BRUTE_MSG "MANGLED"

#define DEFAULT_NO_BURN_MSG "unburnt"
#define DEFAULT_LIGHT_BURN_MSG "numb"
#define DEFAULT_MEDIUM_BURN_MSG "blistered"
#define DEFAULT_HEAVY_BURN_MSG "CHARRED"

#define DEFAULT_NO_PAIN_MSG "painless"
#define DEFAULT_LIGHT_PAIN_MSG "pain"
#define DEFAULT_MEDIUM_PAIN_MSG "PAIN"
#define DEFAULT_HEAVY_PAIN_MSG "AGONY"

#define ROBOTIC_NO_BRUTE_MSG "unmarred"
#define ROBOTIC_LIGHT_BRUTE_MSG "marred"
#define ROBOTIC_MEDIUM_BRUTE_MSG "dented"
#define ROBOTIC_HEAVY_BRUTE_MSG "DESTROYED"

#define ROBOTIC_NO_BURN_MSG "unscorched"
#define ROBOTIC_LIGHT_BURN_MSG "scorched"
#define ROBOTIC_MEDIUM_BURN_MSG "charred"
#define ROBOTIC_HEAVY_BURN_MSG "SMOLDERING"

// ~cyborg limbs
#define ROBOTIC_BRUTE_DMG_MULTIPLIER 0.9
#define ROBOTIC_BURN_DMG_MULTIPLIER 0.9
#define ROBOTIC_PAIN_DMG_MULTIPLIER 0.8

// ~limb efficiency thresholds
#define LIMB_EFFICIENCY_OPTIMAL 100
#define LIMB_EFFICIENCY_DISABLING 50

// ~bodypart status flags
///This organ is organic - It can get infected and heal damage over time
#define BODYPART_ORGANIC 1
///This organ is robotic - Affected by emps, doesn't get infected, doesn't heal damage over time
#define BODYPART_ROBOTIC 2

// ~bodypart animal origins
#define MONKEY_BODYPART "monkey"
#define ALIEN_BODYPART "alien"
#define LARVA_BODYPART "larva"

// ~bodypart trait source
#define BODYPART_TRAIT "bodypart"

// ~flags for the limb_flags var on /obj/item/bodypart
/// Frozen limb, doesn't rot
#define BODYPART_FROZEN	(1<<0)
/// Completely septic and unusable limb
#define BODYPART_DEAD (1<<1)
/// Bodypart is genetically damaged and not functioning good
#define BODYPART_DEFORMED (1<<2)
/// Just got attached but needs to be sewn on to owner
#define BODYPART_CUT_AWAY (1<<3)
/// Does not leave a stump behind when violently severed
#define	BODYPART_NO_STUMP (1<<4)
/// Can suffer bone wounds
#define	BODYPART_HAS_BONE (1<<5)
/// Can suffer tendon wounds
#define	BODYPART_HAS_TENDON	(1<<6)
/// Can suffer nerve wounds
#define	BODYPART_HAS_NERVE (1<<7)
/// Can suffer artery wounds
#define	BODYPART_HAS_ARTERY	(1<<8)
/// Removal or destruction of this limb kills the owner
#define	BODYPART_VITAL (1<<9)
/// Autoheals severe injuries
#define	BODYPART_GOOD_HEALER (1<<10)
/// Bodypart is edible and uses the edible component
#define BODYPART_EDIBLE (1<<11)
/// Bodypart can be affected by EMPs, organic or not
#define BODYPART_SYNTHETIC (1<<12)
/// Bodypart has been EMPed and is malfunctioning
#define BODYPART_SYNTHETIC_EMP (1<<13)
/// Bodypart will never spoil nor get infected
#define BODYPART_NOINFECTION (1<<14)

///Body type bitfields for allowed_animal_origin used to check compatible surgery body types (use NONE for no matching body type)
#define HUMAN_BODY (1 << 0)
#define MONKEY_BODY (1 << 1)
#define ALIEN_BODY (1 << 2)
#define LARVA_BODY (1 << 3)

// ~handedness flags
/// Decent at using even index bodyparts
#define RIGHT_HANDED (1<<0)
/// Decent at using uneven index bodyparats
#define LEFT_HANDED (1<<1)
/// Jack of all trades, master of none (this is different from (RIGHT_HANDED|LEFT_HANDED))
#define AMBIDEXTROUS (1<<2)
/// Default handedness given to carbon mobs
#define DEFAULT_HANDEDNESS RIGHT_HANDED

// ~should take ~20 minutes for a body to fully rot
#define MIN_BODYPART_DECAY_INFECTION 0.5
#define MAX_BODYPART_DECAY_INFECTION 1

// ~body zones
#define BODY_ZONE_PRECISE_L_EYE "l_eye"
#define BODY_ZONE_PRECISE_R_EYE "r_eye"
#define BODY_ZONE_PRECISE_MOUTH "mouth"
#define BODY_ZONE_PRECISE_FACE "face"
#define BODY_ZONE_HEAD "head"
#define BODY_ZONE_PRECISE_NECK "neck"
#define BODY_ZONE_CHEST "chest"
#define BODY_ZONE_PRECISE_GROIN "groin"
#define BODY_ZONE_L_ARM "l_arm"
#define BODY_ZONE_PRECISE_L_HAND "l_hand"
#define BODY_ZONE_R_ARM "r_arm"
#define BODY_ZONE_PRECISE_R_HAND "r_hand"
#define BODY_ZONE_L_LEG "l_leg"
#define BODY_ZONE_PRECISE_L_FOOT "l_foot"
#define BODY_ZONE_R_LEG "r_leg"
#define BODY_ZONE_PRECISE_R_FOOT "r_foot"

// ~retarded body zones
#define BODY_ZONE_PRECISE_R_FINGER_THUMB "r_thumb"
#define BODY_ZONE_PRECISE_R_FINGER_INDEX "r_index_finger"
#define BODY_ZONE_PRECISE_R_FINGER_MIDDLE "r_middle_finger"
#define BODY_ZONE_PRECISE_R_FINGER_RING "r_ring_finger"
#define BODY_ZONE_PRECISE_R_FINGER_PINKY "r_pinky_finger"

#define BODY_ZONE_PRECISE_R_TOE_BIG "r_big_toe"
#define BODY_ZONE_PRECISE_R_TOE_LONG "r_long_toe"
#define BODY_ZONE_PRECISE_R_TOE_MIDDLE "r_middle_toe"
#define BODY_ZONE_PRECISE_R_TOE_RING "r_ring_toe"
#define BODY_ZONE_PRECISE_R_TOE_PINKY "r_pinky_toe"

#define BODY_ZONE_PRECISE_L_FINGER_THUMB "l_thumb"
#define BODY_ZONE_PRECISE_L_FINGER_INDEX "l_index_finger"
#define BODY_ZONE_PRECISE_L_FINGER_MIDDLE "l_middle_finger"
#define BODY_ZONE_PRECISE_L_FINGER_RING "l_ring_finger"
#define BODY_ZONE_PRECISE_L_FINGER_PINKY "l_pinky_finger"

#define BODY_ZONE_PRECISE_L_TOE_BIG "l_big_toe"
#define BODY_ZONE_PRECISE_L_TOE_LONG "l_long_toe"
#define BODY_ZONE_PRECISE_L_TOE_MIDDLE "l_middle_toe"
#define BODY_ZONE_PRECISE_L_TOE_RING "l_ring_toe"
#define BODY_ZONE_PRECISE_L_TOE_PINKY "l_pinky_toe"

// ~bodypart group defines
#define ENHANCEABLE_ZONES list(BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE, \
					BODY_ZONE_PRECISE_FACE, BODY_ZONE_PRECISE_MOUTH, \
					BODY_ZONE_PRECISE_NECK, BODY_ZONE_HEAD, \
					BODY_ZONE_PRECISE_R_HAND, \
					BODY_ZONE_PRECISE_R_FINGER_THUMB, BODY_ZONE_PRECISE_R_FINGER_INDEX, BODY_ZONE_PRECISE_R_FINGER_MIDDLE, \
					BODY_ZONE_PRECISE_R_FINGER_RING, BODY_ZONE_PRECISE_R_FINGER_PINKY, \
					BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_PRECISE_L_FINGER_THUMB, BODY_ZONE_PRECISE_L_FINGER_INDEX, BODY_ZONE_PRECISE_L_FINGER_MIDDLE, \
					BODY_ZONE_PRECISE_L_FINGER_RING, BODY_ZONE_PRECISE_L_FINGER_PINKY, \
					BODY_ZONE_PRECISE_R_FOOT, \
					BODY_ZONE_PRECISE_R_TOE_BIG, BODY_ZONE_PRECISE_R_TOE_LONG, BODY_ZONE_PRECISE_R_TOE_MIDDLE, \
					BODY_ZONE_PRECISE_R_TOE_RING, BODY_ZONE_PRECISE_R_TOE_PINKY, \
					BODY_ZONE_PRECISE_L_FOOT, \
					BODY_ZONE_PRECISE_L_TOE_BIG, BODY_ZONE_PRECISE_L_TOE_LONG, BODY_ZONE_PRECISE_L_TOE_MIDDLE, \
					BODY_ZONE_PRECISE_L_TOE_RING, BODY_ZONE_PRECISE_L_TOE_PINKY)
#define ALL_BODYPARTS_MINUS_EYES list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_FACE, \
					BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_NECK, \
					BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, \
					BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, \
					BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, \
					BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
#define ALL_BODYPARTS_MINUS_EYES_AND_JAW list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_FACE, \
					BODY_ZONE_PRECISE_NECK, \
					BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, \
					BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, \
					BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, \
					BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
#define ALL_BODYPARTS list(BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE, \
					BODY_ZONE_PRECISE_FACE, \
					BODY_ZONE_PRECISE_MOUTH, \
					BODY_ZONE_HEAD, BODY_ZONE_PRECISE_NECK, \
					BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, \
					BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, \
					BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, \
					BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
#define ALL_BODYPARTS_ORDERED list(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, \
					BODY_ZONE_PRECISE_NECK, BODY_ZONE_HEAD, \
					BODY_ZONE_PRECISE_FACE, \
					BODY_ZONE_PRECISE_MOUTH, \
					BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE, \
					BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, \
					BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, \
					BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
#define TORSO_BODYPARTS list(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN)
#define AMPUTATABLE_BODYPARTS list(BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE, \
					BODY_ZONE_PRECISE_MOUTH, \
					BODY_ZONE_PRECISE_NECK, \
					BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, \
					BODY_ZONE_PRECISE_GROIN, \
					BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, \
					BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
#define LIMB_AND_HEAD_BODYPARTS list(BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE, \
					BODY_ZONE_PRECISE_FACE, \
					BODY_ZONE_PRECISE_MOUTH, \
					BODY_ZONE_HEAD, BODY_ZONE_PRECISE_NECK, \
					BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, \
					BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_R_HAND, \
					BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_FOOT, \
					BODY_ZONE_PRECISE_L_FOOT)
#define LIMB_BODYPARTS list(BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_R_HAND, \
					 BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_R_FOOT, \
					BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_L_FOOT)
#define EXTREMITY_BODYPARTS list(BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
#define HEAD_BODYPARTS list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_NECK, \
					BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_L_EYE, \
					BODY_ZONE_PRECISE_R_EYE)
#define ORGAN_BODYPARTS list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE, \
					BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN)
#define MARKING_BODYPARTS list(BODY_ZONE_HEAD, \
					BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, \
					BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, \
					BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, \
					BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, \
					BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
#define SSPARTS	list(/obj/item/bodypart/chest, /obj/item/bodypart/groin, \
					/obj/item/bodypart/neck, /obj/item/bodypart/head, \
					/obj/item/bodypart/face, /obj/item/bodypart/mouth, \
					/obj/item/bodypart/l_eyesocket, /obj/item/bodypart/r_eyesocket, \
					/obj/item/bodypart/r_arm, /obj/item/bodypart/r_hand, \
					/obj/item/bodypart/l_arm, /obj/item/bodypart/l_hand, \
					/obj/item/bodypart/r_leg, /obj/item/bodypart/r_foot, \
					/obj/item/bodypart/l_leg, /obj/item/bodypart/l_foot)

#define BODYPARTS_PATH list(/obj/item/bodypart/l_eyesocket, /obj/item/bodypart/r_eyesocket, \
						/obj/item/bodypart/face, /obj/item/bodypart/mouth, \
						/obj/item/bodypart/head, /obj/item/bodypart/neck, \
						/obj/item/bodypart/chest, /obj/item/bodypart/groin, \
						/obj/item/bodypart/l_arm, /obj/item/bodypart/l_hand, \
						/obj/item/bodypart/r_arm, /obj/item/bodypart/r_hand,\
						/obj/item/bodypart/l_leg, /obj/item/bodypart/l_foot, \
						/obj/item/bodypart/r_leg, /obj/item/bodypart/r_foot)

#define ALIEN_BODYPARTS_PATH list(/obj/item/bodypart/l_eyesocket/alien, /obj/item/bodypart/r_eyesocket/alien, \
								/obj/item/bodypart/face/alien, /obj/item/bodypart/mouth/alien, \
								/obj/item/bodypart/head/alien, /obj/item/bodypart/neck/alien, \
								/obj/item/bodypart/chest/alien, /obj/item/bodypart/groin/alien, \
								/obj/item/bodypart/l_arm/alien, /obj/item/bodypart/l_hand/alien, \
								/obj/item/bodypart/r_arm/alien, /obj/item/bodypart/r_hand/alien, \
								/obj/item/bodypart/r_leg/alien, /obj/item/bodypart/r_foot/alien, \
								/obj/item/bodypart/l_leg/alien, /obj/item/bodypart/l_foot/alien)
#define MONKEY_BODYPARTS_PATH list(/obj/item/bodypart/l_eyesocket/monkey, /obj/item/bodypart/r_eyesocket/monkey, \
							/obj/item/bodypart/face/monkey, /obj/item/bodypart/mouth/monkey, \
							/obj/item/bodypart/head/monkey, /obj/item/bodypart/neck/monkey, \
							/obj/item/bodypart/chest/monkey, /obj/item/bodypart/groin/monkey, \
							/obj/item/bodypart/l_arm/monkey, /obj/item/bodypart/l_hand/monkey, \
							/obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_hand/monkey, \
							/obj/item/bodypart/l_leg/monkey, /obj/item/bodypart/l_foot/monkey, \
							/obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/r_foot/monkey, \
							)
#define LARVA_BODYPARTS_PATH list(/obj/item/bodypart/l_eyesocket/larva, /obj/item/bodypart/r_eyesocket/larva, \
							/obj/item/bodypart/face/larva, /obj/item/bodypart/mouth/larva, \
							/obj/item/bodypart/head/larva, /obj/item/bodypart/neck/larva, \
							/obj/item/bodypart/chest/larva, /obj/item/bodypart/groin/larva, \
							)


code:
/// Modular emoji icon set
#define EMOJI_SET_SEPTIC 'modular_septic/icons/emoji.dmi'


code:
#define SIGNAL_ADDCHEMEFFECT(chem_effect) "addchemeffect [chem_effect]"
#define SIGNAL_REMOVECHEMEFFECT(chem_effect) "removechemeffect [chem_effect]"
#define SIGNAL_INCREASECHEMEFFECT(chem_effect) "increasechemeffect [chem_effect]"
#define SIGNAL_DECREASECHEMEFFECT(chem_effect) "decreasechemeffect [chem_effect]"

/// default chem effect source
#define CHEM_GENERIC "generic"

// ~defines for chemical effects
/// Stabilizes pulse
#define CE_STABLE "stable"
/// Fights off infections
#define CE_ANTIBIOTIC "antibiotic"
/// Boosts spleen blood regen
#define CE_BLOODRESTORE "bloodrestore"
/// Reduces shock
#define CE_PAINKILLER "painkiller"
/// Liver filtering
#define CE_ALCOHOL "alcohol"
/// Liver damage
#define CE_ALCOHOL_TOXIC "alcotoxic"
/// Temporary speed increase/decrease
#define CE_SPEED "speed"
/// Harder to disarm
#define CE_STIMULANT "stimulant"
/// Increases or decreases heart rate
#define CE_PULSE "pulse"
/// Stops heartbeat
#define CE_NOPULSE "heartstop"
/// Reduces toxins in the blood stream
#define CE_ANTITOX "antitox"
/// Increases blood oxygenation
#define CE_OXYGENATED "oxygen"
/// Heals the brain over time
#define CE_BRAIN_REGEN "brainfix"
/// Doubles organ healing from all sources
#define CE_ORGAN_REGEN "organ_regen"
/// Anti-virus effect
#define CE_ANTIVIRAL "antiviral"
/// Generic toxins, stops autoheal
#define CE_TOXIN "toxins"
/// Breathing depression, makes you need more air
#define CE_BREATHLOSS "breathloss"
/// Stabilizes or wrecks mind
#define CE_MIND "mindbending"
/// Prevents damage from being frozen
#define CE_CRYO "cryogenic"
/// Gets in the way of blood circulation, higher the worse
#define CE_BLOCKAGE "blockage"
/// Helium voice. Squeak squeak
#define CE_SQUEAKY "squeaky"
/// Gives xray vision
#define CE_THIRDEYE "thirdeye"
/// Applies sedation effects, i.e. paralysis, inability to use items, etc
#define CE_SEDATE "sedate"
/// Speeds up stamina recovery
#define CE_ENERGETIC "energetic"
/// Lowers the subject's voice to a whisper
#define	CE_VOICELOSS "whispers"


code:
// ~defines for processing reagents, for synth/ipc support
/// Processes reagents with "REAGENT_ORGANIC" or "REAGENT_ORGANIC | REAGENT_SYNTHETIC"
#define REAGENT_ORGANIC (1<<0)
/// Processes reagents with "REAGENT_SYNTHETIC" or "REAGENT_ORGANIC | REAGENT_SYNTHETIC"
#define REAGENT_SYNTHETIC (1<<1)

// ~reagent flags
/// Show on advanced scanners only
#define REAGENT_VISIBLE_ADVANCED (1<<7)

// ~polarity defines
///Polar (water soluble)
#define POLARITY_POLAR "polar"
///Non-polar (not water soluble)
#define POLARITY_NONPOLAR "nonpolar"

///Standard amount necessary to overdose on most chemicals
#define OVERDOSE_STANDARD 30


code:
#define COLOR_THEME_CODEC_GREEN "#5D9B79"
#define COLOR_THEME_CODEC_BLUE "#8AC4C3"

#define COLOR_THEME_QUAKE_GREEN "#97EDCA"
#define COLOR_THEME_QUAKE_BLUE "#4DBEFF"

#define COLOR_RED_ARTERY "#9b5455"
#define COLOR_RED_BLOODY "#cc0f0f"

#define COLOR_BROWN_SHIT "#815131"
#define COLOR_YELLOW_PISS "#d6d33396"
#define COLOR_WHITE_CUM "#fffae8e6"
#define COLOR_WHITE_FEMCUM "#fffcf058"


code:
// ~damage flag defines
/// Pain damage type
#define PAIN "pain"
/// Shock (technically just pain but might be useful i guess?)
#define SHOCK_PAIN "shock"
/// Shock stage damage type
#define SHOCK_STAGE "shock_stage"
/// Fatigue damage type
#define FATIGUE "fatigue"

// ~combat style defines
#define CS_DUAL "dual"
#define CS_GUARD "guard"
#define CS_DEFEND "defend"
#define CS_STRONG "strong"
#define CS_FURY "fury"
#define CS_AIMED "aimed"
#define CS_WEAK "weak"
#define CS_FEINT "feint"
#define CS_NONE "none"
#define CS_DEFAULT CS_NONE

// ~dodge and parry
#define DP_PARRY "parry"
#define DP_DODGE "dodge"

// ~special attacks (kicking, biting and jumping)
#define SPECIAL_ATK_KICK "kick"
#define SPECIAL_ATK_BITE "bite"
#define SPECIAL_ATK_JUMP "jump"
#define SPECIAL_ATK_STEAL "steal"
#define SPECIAL_ATK_NONE "none"

// ~grabbies
#define GM_STAUNCH "staunch"
#define GM_WRENCH "wrench"
#define GM_TEAROFF "tear"
#define GM_STRANGLE "strangle"
#define GM_TAKEDOWN "takedown"
#define GM_EMBEDDED "embedded"

//need at least this strength diff to tear someone's limb off
#define GM_TEAROFF_DIFF 6

// ~combat flags
/// Trying to sprint
#define COMBAT_FLAG_SPRINT_ACTIVE	(1<<0)
/// Sprinting
#define COMBAT_FLAG_SPRINTING		(1<<1)
/// Cannot sprint
#define COMBAT_FLAG_SPRINT_LOCKED	(1<<2)

#define PAIN_KNOCKOUT_MESSAGE "caves in to the pain!"
#define PAIN_KNOCKOUT_MESSAGE_SELF "OH LORD! The PAIN!"

// ~projectile diceroll stuff
/// How much we multiply the initial skills and stats by for the diceroll
#define PROJECTILE_DICEROLL_ATTRIBUTE_MULTIPLIER 1.4
/// How much we exponentiate the distance by to get the negative modifier
#define PROJECTILE_DICEROLL_DISTANCE_EXPONENT 1.8

// ~fatigue mechanics
///How much stamina someone with 10 endurance will regen, per  2 seconds
#define FATIGUE_REGEN_FACTOR 1
///How much to multiply fatigue regen when lying down
#define FATIGUE_REGEN_LYING_MULTIPLIER 2
///Fatigue will not regenerate if we recently suffered fatigue loss
#define FATIGUE_REGEN_COOLDOWN 2 SECONDS
///Default maximum fatigue for a mob
#define DEFAULT_MAX_FATIGUE 120
///This is the lowest fatigue amount we can reach
#define FATIGUE_MINIMUM -100
///Above this point in fatigueloss, we enter fatiguecrit
#define FATIGUE_CRIT_THRESHOLD 100

//click cooldowns, in tenths of a second, used for various combat actions
#undef CLICK_CD_GRABBING
#define CLICK_CD_GRABBING 30
#define CLICK_CD_PULLING 10
#define CLICK_CD_WRENCH 20
#define CLICK_CD_TAKEDOWN 20
#define CLICK_CD_STRANGLE 30
#define CLICK_CD_JUMP 20
#define CLICK_CD_CLING 15


code:
#define CULTURE_BIRTHSIGN "birthsign"

#define ALL_CULTURE_TYPES list(CULTURE_BIRTHSIGN)

//Amount of linguistic points people have by default. 1 point to understand, 2 points to get it spoken
#define LINGUISTIC_POINTS_DEFAULT 4

#define LANGUAGE_NOT_UNDERSTOOD 0
#define LANGUAGE_UNDERSTOOD	1
#define LANGUAGE_SPOKEN	2

//GROUPED CULTURAL DEFINES FOR SPECIES
#define BIRTHSIGNS_GENERIC list( \
						/datum/cultural_info/birthsign/starless, \
						/datum/cultural_info/birthsign/warrior, \
						/datum/cultural_info/birthsign/mage, \
						)


code:
///from base of obj/item/bodypart/apply_splint() (obj/item/stack/splint)
#define COMSIG_BODYPART_SPLINTED "bodypart_splinted"
///from base of obj/item/bodypart/remove_splint() (drop_splint)
#define COMSIG_BODYPART_SPLINT_DESTROYED "bodypart_unsplinted"

///from base of obj/item/embedded() (atom/embedded_target, obj/item/bodypart/part)
#define COMSIG_ITEM_EMBEDDED "item_embedded"
///from base of obj/item/unembedded() (atom/embedded_target, obj/item/bodypart/part)
#define COMSIG_ITEM_UNEMBEDDED "item_unembedded"

///from base of obj/projectile/process_hit() (turf/T, atom/target, atom/bumped, hit_something = FALSE)
#define COMSIG_PROJECTILE_POSTHIT "projectile_posthit"
///from base of mob/living/carbon/clear_wound_message()
#define COMSIG_CARBON_CLEAR_WOUND_MESSAGE "clear_wound_message"
///from base of mob/living/carbon/add_to_wound_message() (new_message, clear_message)
#define COMSIG_CARBON_ADD_TO_WOUND_MESSAGE "add_to_wound_message"

///from base of mob/living/Daze() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_DAZE "living_daze"
///from base of mob/living/Stumble() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_STUMBLE "living_stumble"
///from base of mob/living/HeadRape() (amount, update, ignore)
#define COMSIG_LIVING_STATUS_HEADRAPE "living_headrape"

///from base of atom/attack_foot(): (mob/user, modifiers)
#define COMSIG_MOB_ATTACK_FOOT "mob_attack_foot"
///from base of atom/attack_jaw(): (mob/user, modifiers)
#define COMSIG_MOB_ATTACK_JAW "mob_attack_jaw"

// ~field of vision
///from base of client/change_view() (client, old_view, view)
#define COMSIG_MOB_CLIENT_CHANGE_VIEW "mob_client_change_view"
///from base of mob/reset_perspective() (atom/target)
#define COMSIG_MOB_RESET_PERSPECTIVE "mob_reset_perspective"
///from base of atom/ShiftClick() (atom/A) - for return values, see COMSIG_CLICK_SHIFT
#define COMSIG_MOB_CLICKED_SHIFT_ON "mob_shift_click_on"
///from base of mob/visible_atoms() (list/visible_atoms)
#define COMSIG_MOB_FOV_VIEW "mob_visible_atoms"
	#define COMPONENT_DENY_EXAMINATE (1<<0) //cancels examinate completely
	#define COMPONENT_EXAMINATE_BLIND (1<<1) //outputs the "something is there but you can't see it" message.
///from base of get_actual_viewers() (atom/center, depth, viewers_list)
#define COMSIG_MOB_FOV_VIEWER "mob_is_viewer"
///from base of atom/visible_message() (atom/A, msg, range, ignored_mobs)
#define COMSIG_MOB_GET_VISIBLE_MESSAGE "mob_get_visible_message"
	#define COMPONENT_DENY_VISIBLE_MESSAGE (1<<0) //cancels visible message completely
	#define COMPONENT_VISIBLE_MESSAGE_BLIND (1<<1) //outputs blind message instead

///from base of atom/attack_foot(): (mob/user, modifiers)
#define COMSIG_ATOM_ATTACK_FOOT "atom_attack_foot"
///from base of atom/attack_jaw(): (mob/user, modifiers)
#define COMSIG_ATOM_ATTACK_JAW "atom_attack_jaw"
///from base of atom/setDir() (old_dir, new_dir). Called before the direction changes.
#define COMSIG_ATOM_PRE_DIR_CHANGE "atom_pre_dir_change"
	#define COMPONENT_DENY_DIR_CHANGE 1
///from base of atom/setDir() (old_dir, new_dir). Called after the direction changes.
#define COMSIG_ATOM_POST_DIR_CHANGE "atom_post_dir_change"

///from base of atom/MiddleClick() (mob/user)
#define COMSIG_CLICK_MIDDLE "middle_click"
	#define COMPONENT_CANCEL_CLICK_MIDDLE 1 //cancels middle click completely

///from base of turf/handle_fall() (mob/faller)
#define COMSIG_TURF_MOB_FALL "turf_mob_fall"
///from base of atom/movable/liquid_turf/Initialize() (atom/movable/liquid_turf/liquids)
#define COMSIG_TURF_LIQUIDS_CREATION "turf_liquids_creation"
	#define COMPONENT_DENY_LIQUID_CREATION 1 //cancels the creation of the liquid movable

// ~fov component
///hides FoV
#define COMSIG_FOV_HIDE "fov_hide"
///shows FoV
#define COMSIG_FOV_SHOW "fov_show"

// ~twohanded component
///from base of datum/component/two_handed/proc/wield_check()
#define COMSIG_TWOHANDED_WIELD_CHECK "twohanded_wield_check"

// ~fix eye component
///from base of datum/component/fixeye/user_toggle_fixeye() (mob/living/source, silent, forced)
#define COMSIG_FIXEYE_TOGGLE "fixeye_toggle"
///from base of datum/component/fixeye/check_flags(mob/living/source, flags)
#define COMSIG_FIXEYE_CHECK	"fixeye_check"
///from base of datum/component/fixeye/safe_enable_fixeye() (mob/living/source, silent, forced)
#define COMSIG_FIXEYE_ENABLE "fixeye_enable"
///from base of datum/component/fixeye/safe_disable_fixeye() (mob/living/source, silent, forced)
#define COMSIG_FIXEYE_DISABLE "fixeye_disable"
///from base of datum/component/fixeye/enable_fixeye() (mob/living/source, silent, forced)
#define COMSIG_LIVING_FIXEYE_ENABLED "fixeye_enabled"
///from base of datum/component/fixeye/disable_fixeye() (mob/living/source, silent, forced)
#define COMSIG_LIVING_FIXEYE_DISABLED "fixeye_disabled"

// ~clingable element
///from base of datum/element/clingable/clingable_check() (mob/user)
#define COMSIG_CLINGABLE_CHECK "clingable_check"

// ~interactable component
///from base of datum/component/interactable/try_interact(atom/source, mob/living/user)
#define COMSIG_INTERACTABLE_TRY_INTERACT "interactable_try_interact"
///from base of datum/component/interactable/on_cooldown()
#define COMSIG_INTERACTABLE_COOLDOWN "interactable_cooldown"
///from base of datum/component/interactable/on_sex_cooldown()
#define COMSIG_INTERACTABLE_SEX_COOLDOWN "interactable_sex_cooldown"

// ~storage component
///from base of datum/component/storage/can_user_take(mob/user)
#define COMSIG_STORAGE_CAN_USER_TAKE "storage_can_user_take"

// ~fireaxe element
///from base of datum/element/fireaxe_brittle/do_break()
#define COMSIG_FIREAXE_BRITTLE_BREAK "fireaxe_brittle_break"

///from base of datum/component/pellet_cloud/proc/projectile_embedded(obj/projectile/source)
#define COMSIG_PELLET_CLOUD_EMBEDDED "pellet_cloud_embedded"
///from base of datum/component/pellet_cloud/proc/projectile_went_through(obj/projectile/source)
#define COMSIG_PELLET_CLOUD_WENT_THROUGH "pellet_cloud_went_through"


code:
//General filter defines
#define GENERAL_AMBIENT_OCCLUSION1 list("type" = "drop_shadow", "x" = 2, "y"= -2, "size" = 3, "offset"= 1, "color"=rgb(4, 8, 16, 100))
#define GENERAL_AMBIENT_OCCLUSION2 list("type" = "drop_shadow", "x" = -2, "y"= 2, "size" = 3, "offset"= 1, "color"=rgb(4, 8, 16, 100))
#define WALL_AMBIENT_OCCLUSION1 list("type" = "drop_shadow", "x"= 2, "y"= -2, "size"= 4, "offset"= 1, "color" = rgb(4, 8, 16, 150))
#define WALL_AMBIENT_OCCLUSION2 list("type" = "drop_shadow", "x"= -2, "y"= 2, "size"= 4, "offset"= 1, "color" = rgb(4, 8, 16, 150))
#define MOB_AMBIENT_OCCLUSION1 list("type" = "drop_shadow", "x"= 1, "y"= -1, "size"= 2, "offset"= 1, "color" = rgb(4, 8, 16, 120))
#define	MOB_AMBIENT_OCCLUSION2 list("type" = "drop_shadow", "x"= -1, "y"= 1, "size"= 2, "offset"= 1, "color" = rgb(4, 8, 16, 120))
#define	RUNECHAT_AMBIENT_OCCLUSION1 list("type" = "drop_shadow", "x"= 0, "y"= -2, "size"= 4, "offset"= 0, "color" = "#04080FAA")

#define WRAITH_BLUR list("type" = "blur", "size" = 1)


code:
#define TURF_FIRE_REQUIRED_TEMP (T0C+10)
#define TURF_FIRE_TEMP_BASE (T0C+100)
#define TURF_FIRE_POWER_LOSS_ON_LOW_TEMP 7
#define TURF_FIRE_TEMP_INCREMENT_PER_POWER 3
#define TURF_FIRE_VOLUME 150
#define TURF_FIRE_MAX_POWER 300

#define TURF_FIRE_ENERGY_PER_BURNED_OXY_MOL 12000
#define TURF_FIRE_BURN_RATE_BASE 0.12
#define TURF_FIRE_BURN_RATE_PER_POWER 0.02
#define TURF_FIRE_BURN_CARBON_DIOXIDE_MULTIPLIER 0.75

#define TURF_FIRE_STATE_SMALL 1
#define TURF_FIRE_STATE_MEDIUM 2
#define TURF_FIRE_STATE_LARGE 3

#define IGNITE_TURF_CHANCE 30
#define IGNITE_NEIGHBOR_TURF_CHANCE 10
#define IGNITE_TURF_LOW_POWER 8
#define IGNITE_TURF_HIGH_POWER 22


code:
// ~fixeye flags.
/// The user wants fixeye on
#define FIXEYE_TOGGLED (1<<0)
/// fixeye is active.
#define FIXEYE_ACTIVE (1<<1)
/// fixeye is not active
#define FIXEYE_INACTIVE	(1<<2)


code:
#undef FOOD_FLAGS
#define FOOD_FLAGS list( \
	"MEAT", \
	"VEGETABLES", \
	"RAW", \
	"JUNKFOOD", \
	"GRAIN", \
	"FRUIT", \
	"DAIRY", \
	"FRIED", \
	"ALCOHOL", \
	"SUGAR", \
	"GROSS", \
	"TOXIC", \
	"PINEAPPLE", \
	"BREAKFAST", \
	"CLOTH", \
	"NUTS", \
	"SEAFOOD", \
	"SEWAGE", \
)


code:
#define HAS_SHIT_DNA(thing) (length(thing.GetComponent(/datum/component/forensics)?.shit_DNA))
#define HAS_CUM_DNA(thing) (length(thing.GetComponent(/datum/component/forensics)?.cum_DNA))
#define HAS_FEMCUM_DNA(thing) (length(thing.GetComponent(/datum/component/forensics)?.femcum_DNA))


code:
/// Field of vision defines.
#define FOV_90_DEGREES	"90"
#define FOV_180_DEGREES	"180"
#define FOV_180MINUS45_DEGREES "180_315"
#define FOV_180PLUS45_DEGREES "180_45"
#define FOV_270_DEGREES	"270"


code:
// ~hehe peepee - use centimeters you stupid americunt
#define PENIS_MIN_GIRTH 1
#define PENIS_DEFAULT_GIRTH 12
#define PENIS_MAX_GIRTH 20
#define PENIS_MIN_LENGTH 1
#define PENIS_DEFAULT_LENGTH 15
#define PENIS_MAX_LENGTH 30

// ~these use arbitrary numbers for size
#define BREASTS_MIN_SIZE 0
#define BREASTS_DEFAULT_SIZE 1
#define BREASTS_MAX_SIZE 7
#define BREASTS_DEFAULT_LACTATION FALSE
#define BALLS_MIN_SIZE 0
#define BALLS_DEFAULT_SIZE 1
#define BALLS_MAX_SIZE 4

// ~peepee sheaths
#define SHEATH_NONE	"None"
#define SHEATH_NORMAL "Sheath"
#define SHEATH_SLIT	"Slit"
#define SHEATH_MODES list(SHEATH_NONE, SHEATH_NORMAL, SHEATH_SLIT)

// ~peepee visibility
#define GENITAL_SKIP_VISIBILITY 0
#define GENITAL_NEVER_SHOW 1
#define GENITAL_HIDDEN_BY_CLOTHES 2
#define GENITAL_ALWAYS_SHOW 3

// ~arousal levels (?)
#define AROUSAL_CANT 0
#define AROUSAL_NONE 1
#define AROUSAL_PARTIAL 2
#define AROUSAL_FULL 3

// ~sets of genitals
#define GENITALS_MALE "Male"
#define GENITAL_SET_MALE list(ORGAN_SLOT_PENIS, ORGAN_SLOT_TESTICLES)
#define GENITALS_FEMALE "Female"
#define GENITAL_SET_FEMALE list(ORGAN_SLOT_VAGINA, ORGAN_SLOT_WOMB, ORGAN_SLOT_BREASTS)
#define GENITALS_CUNTBOY "Cuntboy"
#define GENITAL_SET_CUNTBOY list(ORGAN_SLOT_VAGINA, ORGAN_SLOT_WOMB)
#define GENITALS_FUTA "Futa"
#define GENITAL_SET_FUTA list(ORGAN_SLOT_PENIS, ORGAN_SLOT_TESTICLES, ORGAN_SLOT_VAGINA, ORGAN_SLOT_WOMB, ORGAN_SLOT_BREASTS)
#define GENITALS_DICKGIRL "Dickgirl"
#define GENITAL_SET_DICKGIRL list(ORGAN_SLOT_PENIS, ORGAN_SLOT_TESTICLES, ORGAN_SLOT_BREASTS)

// ~genital_flags var
#define GENITAL_CAN_CLIMAX (1<<0)


code:
// ~safety flags
#define HAS_SAFETY (1<<0)
#define SAFETY_ENABLED (1<<1)
#define SAFETY_OVERLAY_ENABLED (1<<2)
#define SAFETY_OVERLAY_DISABLED (1<<3)

#define SAFETY_FLAGS_DEFAULT (HAS_SAFETY|SAFETY_ENABLED)