Files
Paradise/code/__DEFINES/misc_defines.dm
Charlie Nolan 2b98749d32 Make DB admin ranks more useful (#29906)
* Make DB admin ranks more useful

* Avoid error message when cancelling permission toggle, allow adding localhost admins as real admins.

* Lint.

* Don't SQL error when a previously-unseen player connects.

* Use ckey of permission editor, not mob name.

* Strikethrough

* Order in the list.

* Deadmin, readmin, and 2fa.

* Correct merge error

---------

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
2025-08-10 12:05:19 +01:00

787 lines
27 KiB
Plaintext

//Object specific defines
#define CANDLE_LUM 3 //For how bright candles are
//Security levels
#define SEC_LEVEL_GREEN 0
#define SEC_LEVEL_BLUE 1
#define SEC_LEVEL_RED 2
#define SEC_LEVEL_GAMMA 3
#define SEC_LEVEL_EPSILON 4
#define SEC_LEVEL_DELTA 5
//Click cooldowns, in tenths of a second
#define CLICK_CD_MELEE 8
#define CLICK_CD_RANGE 4
#define CLICK_CD_TKSTRANGLE 10
#define CLICK_CD_POINT 10
#define CLICK_CD_RESIST 8
#define CLICK_CD_PARRY 8
#define CLICK_CD_CLICK_ABILITY 6
#define CLICK_CD_RAPID 2
///
#define ROUNDSTART_LOGOUT_REPORT_TIME 6000 //Amount of time (in deciseconds) after the rounds starts, that the player disconnect report is issued.
// DOOR CRUSHING DAMAGE!
#define DOOR_CRUSH_DAMAGE 10
////////////GERMS AND INFECTIONS////////////
#define GERM_LEVEL_AMBIENT 110 //maximum germ level you can reach by standing still
#define GERM_LEVEL_MOVE_CAP 200 //maximum germ level you can reach by running around
#define INFECTION_LEVEL_ONE 100
#define INFECTION_LEVEL_TWO 500
#define INFECTION_LEVEL_THREE 1000
#define INFECTION_LEVEL_FOUR 1500
// Damage above this value must be repaired with surgery.
#define ROBOLIMB_SELF_REPAIR_CAP 60
//metal, glass, rod stacks
#define MAX_STACK_AMOUNT_METAL 50
#define MAX_STACK_AMOUNT_GLASS 50
#define MAX_STACK_AMOUNT_RODS 60
//FONTS:
// Used by Paper and PhotoCopier (and PaperBin once a year).
// Used by PDA's Notekeeper.
// Used by NewsCaster and NewsPaper.
// Used by Modular Computers
#define PEN_FONT "Verdana"
#define CRAYON_FONT "Comic Sans MS"
#define PRINTER_FONT "Times New Roman"
#define SIGNFONT "Times New Roman"
/// Emoji icon set
#define EMOJI_SET 'icons/ui_icons/emoji.dmi'
//some arbitrary defines to be used by self-pruning global lists. (see master_controller)
#define PROCESS_KILL 26 //Used to trigger removal from a processing list
//Flags for zone sleeping
#define ZONE_ACTIVE 1
#define ZONE_SLEEPING 0
#define EVENT_LEVEL_MUNDANE 1
#define EVENT_LEVEL_MODERATE 2
#define EVENT_LEVEL_MAJOR 3
#define JANUARY 1
#define FEBRUARY 2
#define MARCH 3
#define APRIL 4
#define MAY 5
#define JUNE 6
#define JULY 7
#define AUGUST 8
#define SEPTEMBER 9
#define OCTOBER 10
#define NOVEMBER 11
#define DECEMBER 12
//Select holiday names -- If you test for a holiday in the code, make the holiday's name a define and test for that instead
#define NEW_YEAR "New Year"
#define VALENTINES "Valentine's Day"
#define APRIL_FOOLS "April Fool's Day"
#define EASTER "Easter"
#define HALLOWEEN "Halloween"
#define CHRISTMAS "Christmas"
#define FRIDAY_13TH "Friday the 13th"
#define RESIZE_DEFAULT_SIZE 1
//transfer_ai() defines. Main proc in ai_core.dm
#define AI_TRANS_TO_CARD 1 //Downloading AI to InteliCard.
#define AI_TRANS_FROM_CARD 2 //Uploading AI from InteliCard
#define AI_MECH_HACK 3 //Malfunctioning AI hijacking mecha
#define AI_SHUTTLE_HACK 4 //Malfunctioning AI hijacking shuttle
//singularity defines
#define STAGE_ONE 1
#define STAGE_TWO 3
#define STAGE_THREE 5
#define STAGE_FOUR 7
#define STAGE_FIVE 9
#define STAGE_SIX 11 //From supermatter shard
#define STAGE_TWO_THRESHOLD 200
#define STAGE_THREE_THRESHOLD 500
#define STAGE_FOUR_THRESHOLD 1000
#define STAGE_FIVE_THRESHOLD 2000
#define STAGE_SIX_THRESHOLD 3000
/// A define for the center of the coordinate map of big machinery
#define MACH_CENTER 2
#define in_range(source, user) (get_dist(source, user) <= 1)
#define RANGE_TURFS(RADIUS, CENTER) \
RECT_TURFS(RADIUS, RADIUS, CENTER)
#define RECT_TURFS(H_RADIUS, V_RADIUS, CENTER) \
block( \
max(CENTER.x - (H_RADIUS), 1), max(CENTER.y - (V_RADIUS), 1), CENTER.z, \
min(CENTER.x + (H_RADIUS), world.maxx), min(CENTER.y + (V_RADIUS), world.maxy), CENTER.z \
)
/// Returns the turfs on the edge of a square with CENTER in the middle and with the given RADIUS. If used near the edge of the map, will still work fine.
// order of the additions: top edge + bottom edge + left edge + right edge
#define RANGE_EDGE_TURFS(RADIUS, CENTER)\
(CENTER.y + RADIUS < world.maxy ? block(max(CENTER.x - RADIUS, 1), min(CENTER.y + RADIUS, world.maxy), CENTER.z, min(CENTER.x + RADIUS, world.maxx), min(CENTER.y + RADIUS, world.maxy), CENTER.z) : list()) +\
(CENTER.y - RADIUS > 1 ? block(max(CENTER.x - RADIUS, 1), max(CENTER.y - RADIUS, 1), CENTER.z, min(CENTER.x + RADIUS, world.maxx), max(CENTER.y - RADIUS, 1), CENTER.z) : list()) +\
(CENTER.x - RADIUS > 1 ? block(max(CENTER.x - RADIUS, 1), min(CENTER.y + RADIUS - 1, world.maxy), CENTER.z, max(CENTER.x - RADIUS, 1), max(CENTER.y - RADIUS + 1, 1), CENTER.z) : list()) +\
(CENTER.x + RADIUS < world.maxx ? block(min(CENTER.x + RADIUS, world.maxx), min(CENTER.y + RADIUS - 1, world.maxy), CENTER.z, min(CENTER.x + RADIUS, world.maxx), max(CENTER.y - RADIUS + 1, 1), CENTER.z) : list())
#define FOR_DVIEW(type, range, center, invis_flags) \
GLOB.dview_mob.loc = center; \
GLOB.dview_mob.see_invisible = invis_flags; \
for(type in view(range, GLOB.dview_mob))
#define END_FOR_DVIEW GLOB.dview_mob.loc = null
//Turf locational stuff
#define get_turf(A) (get_step(A, 0))
#define NORTH_OF_TURF(T) locate(T.x, T.y + 1, T.z)
#define EAST_OF_TURF(T) locate(T.x + 1, T.y, T.z)
#define SOUTH_OF_TURF(T) locate(T.x, T.y - 1, T.z)
#define WEST_OF_TURF(T) locate(T.x - 1, T.y, T.z)
#define ATOM_COORDS(A) list(A.x, A.y, A.z)
#define MIN_SUPPLIED_LAW_NUMBER 15
#define MAX_SUPPLIED_LAW_NUMBER 50
/// Grabs the area of a supplied object. Passing an area in to this will result in an error
#define get_area(T) ((get_step(T, 0)?.loc))
//check_target_facings() return defines
#define FACING_FAILED 0
#define FACING_SAME_DIR 1
#define FACING_EACHOTHER 2
#define FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR 3 //Do I win the most informative but also most stupid define award?
#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day
#define CAMERA_VIEW_DISTANCE 7
#define CAMERA_CHUNK_SIZE 16 // Only chunk sizes that are to the power of 2. E.g: 2, 4, 8, 16, etc..
//Turf wet states
#define TURF_DRY 0
#define TURF_WET_WATER 1
#define TURF_WET_LUBE 2
#define TURF_WET_ICE 3
#define TURF_WET_PERMAFROST 4
#define APPEARANCE_UI_IGNORE_ALPHA RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA
// Metal foam states
// teehee no one will find these here
#define METAL_FOAM_ALUMINUM 1
#define METAL_FOAM_IRON 2
// Defines for foam
/// The chemicals in the foam (if any) will never react.
#define FOAM_REACT_NEVER (1<<0)
/// Chemicals in the foam will only react when the foam dissipates.
#define FOAM_REACT_ON_DISSIPATE (1<<1)
/// Chemicals in the foam will react while the foam is still processing.
#define FOAM_REACT_DURING_SPREAD (1<<2)
/// Chemicals in the foam will react when the foam first reaches a tile.
#define FOAM_REACT_BEFORE_SPREAD (1<<3)
//Human Overlays Indexes/////////
#define EYES_OVERLAY_LAYER 50
#define MISC_LAYER 49 // Handles eye_shine() -> cybernetic eyes, specific eye traits.
#define WING_LAYER 48
#define WING_UNDERLIMBS_LAYER 47
#define MUTANTRACE_LAYER 46
#define TAIL_UNDERLIMBS_LAYER 45 //Tail split-rendering.
#define LIMBS_LAYER 44
#define MARKINGS_LAYER 43
#define INTORGAN_LAYER 42
#define UNDERWEAR_LAYER 41
#define MUTATIONS_LAYER 40
#define H_DAMAGE_LAYER 39
#define UNIFORM_LAYER 38
#define ID_LAYER 37
#define HANDS_LAYER 36 //Exists to overlay hands over jumpsuits
#define SHOES_LAYER 35
#define L_FOOT_BLOOD_LAYER 34 // Blood overlay separation Left-Foot
#define R_FOOT_BLOOD_LAYER 33 // Blood overlay separation Right-Foot
#define GLOVES_LAYER 32
#define L_HAND_BLOOD_LAYER 31 // Blood overlay separation Left-Hand
#define R_HAND_BLOOD_LAYER 30 // Blood overlay separation Right-Hand
#define LEFT_EAR_LAYER 29
#define RIGHT_EAR_LAYER 28
#define BELT_LAYER 27 //Possible make this an overlay of something required to wear a belt?
#define SPECIAL_NECK_LAYER 26
#define SUIT_LAYER 25
#define SPECIAL_BELT_LAYER 24
#define NECK_LAYER 23
#define SUIT_STORE_LAYER 22
#define BACK_LAYER 21
#define HEAD_ACCESSORY_LAYER 20
#define FHAIR_LAYER 19
#define GLASSES_LAYER 18
#define HAIR_LAYER 17 //TODO: make part of head layer?
#define HEAD_ACC_OVER_LAYER 16 //Select-layer rendering.
#define FHAIR_OVER_LAYER 15 //Select-layer rendering.
#define GLASSES_OVER_LAYER 14 //Select-layer rendering.
#define TAIL_LAYER 13 //bs12 specific. this hack is probably gonna come back to haunt me
#define FACEMASK_LAYER 12
#define OVER_MASK_LAYER 11 //Select-layer rendering.
#define HEAD_LAYER 10
#define COLLAR_LAYER 9
#define HANDCUFF_LAYER 8
#define LEGCUFF_LAYER 7
#define L_HAND_LAYER 6
#define R_HAND_LAYER 5
#define TARGETED_LAYER 4 //BS12: Layer for the target overlay from weapon targeting system
#define HALO_LAYER 3 //blood cult ascended halo, because there's currently no better solution for adding/removing
#define FIRE_LAYER 2 //If you're on fire
#define FROZEN_LAYER 1
#define TOTAL_LAYERS 50
///Access Region Codes///
#define REGION_ALL 0
#define REGION_GENERAL 1
#define REGION_SECURITY 2
#define REGION_MEDBAY 3
#define REGION_RESEARCH 4
#define REGION_ENGINEERING 5
#define REGION_SUPPLY 6
#define REGION_COMMAND 7
#define REGION_CENTCOMM 8
//Just space
#define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]"
//used for maploader
#define MAP_MINX 1
#define MAP_MINY 2
#define MAP_MINZ 3
#define MAP_MAXX 4
#define MAP_MAXY 5
#define MAP_MAXZ 6
//Matricies
#define MATRIX_GREYSCALE list(0.33, 0.33, 0.33,\
0.33, 0.33, 0.33,\
0.33, 0.33, 0.33)
#define MATRIX_VULP_CBLIND list(0.5,0.4,0.1,\
0.5,0.4,0.1,\
0.0,0.2,0.8)
#define MATRIX_TAJ_CBLIND list(0.4,0.2,0.4,\
0.4,0.6,0.0,\
0.2,0.2,0.6)
#define MATRIX_STANDARD list(1.0,0.0,0.0,\
0.0,1.0,0.0,\
0.0,0.0,1.0)
/*
Used for wire name appearances. Replaces the color name on the left with the one on the right.
The color on the left is the one used as the actual color of the wire, but it doesn't look good when written.
So, we need to replace the name to something that looks better.
*/
#define LIST_COLOR_RENAME \
list( \
"rebeccapurple" = "dark purple",\
"darkslategrey" = "dark grey", \
"darkolivegreen"= "dark green", \
"darkslateblue" = "dark blue", \
"darkkhaki" = "khaki", \
"darkseagreen" = "light green",\
"midnightblue" = "blue", \
"lightgrey" = "light grey", \
"darkgrey" = "dark grey", \
"steelblue" = "blue", \
"goldenrod" = "gold" \
)
/// Pure Black and white colorblindness. Every species except Vulpkanins and Tajarans will have this.
#define GREYSCALE_COLOR_REPLACE \
list( \
"red" = "grey", \
"blue" = "grey", \
"green" = "grey", \
"orange" = "light grey", \
"brown" = "grey", \
"gold" = "light grey", \
"cyan" = "silver", \
"magenta" = "grey", \
"purple" = "grey", \
"pink" = "light grey" \
)
/// Red colorblindness. Vulpkanins/Wolpins have this.
#define PROTANOPIA_COLOR_REPLACE \
list( \
"red" = "darkolivegreen", \
"green" = "darkslategrey", \
"orange" = "goldenrod", \
"gold" = "goldenrod", \
"brown" = "darkolivegreen", \
"cyan" = "steelblue", \
"magenta" = "blue", \
"purple" = "darkslategrey", \
"pink" = "beige" \
)
/// Yellow-Blue colorblindness. Tajarans/Farwas have this.
#define TRITANOPIA_COLOR_REPLACE \
list( \
"red" = "rebeccapurple", \
"blue" = "darkslateblue", \
"green" = "darkolivegreen", \
"orange" = "darkkhaki", \
"gold" = "darkkhaki", \
"brown" = "rebeccapurple", \
"cyan" = "darkseagreen", \
"magenta" = "darkslateblue", \
"purple" = "darkslateblue", \
"pink" = "lightgrey" \
)
//Gun trigger guards
#define TRIGGER_GUARD_ALLOW_ALL -1
#define TRIGGER_GUARD_NONE 0
#define TRIGGER_GUARD_NORMAL 1
// These comments mirror the below define in the order of operations to help you understand what it is doing
// Check if datum I is a mob
// If I is a mob, return the client of mob I
// Else, check to see if I is a client
// If I is a client, return I
// Else, check to see if I is a mind
// If I is a mind, try and return the mind's current mob's client
/// Return a Client
#define CLIENT_FROM_VAR(I) (ismob(I) \
? I:client \
: istype(I, /client) \
? I \
: istype(I, /datum/mind \
? I:current?:client \
: null))
// Macro to get the current elapsed round time, rather than total world runtime
#define ROUND_TIME (SSticker.time_game_started ? (world.time - SSticker.time_game_started) : 0)
// Macro that returns true if it's too early in a round to freely ghost out
#define TOO_EARLY_TO_GHOST (ROUND_TIME < GLOB.configuration.general.cryo_penalty_period MINUTES)
// Used by radios to indicate that they have sent a message via something other than subspace
#define RADIO_CONNECTION_FAIL 0
#define RADIO_CONNECTION_NON_SUBSPACE 1
// Bluespace shelter deploy checks
#define SHELTER_DEPLOY_ALLOWED "allowed"
#define SHELTER_DEPLOY_BAD_TURFS "bad turfs"
#define SHELTER_DEPLOY_BAD_AREA "bad area"
#define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects"
// transit_tube stuff
#define TRANSIT_TUBE_OPENING 0
#define TRANSIT_TUBE_OPEN 1
#define TRANSIT_TUBE_CLOSING 2
#define TRANSIT_TUBE_CLOSED 3
// Maximum donation level
#define DONATOR_LEVEL_MAX 4
// The cooldown on OOC messages such as OOC, LOOC, praying and adminhelps
#define OOC_COOLDOWN 5
// The number of station goals generated each round.
#define STATION_GOAL_BUDGET 1
#define FIRST_DIAG_STEP 1
#define SECOND_DIAG_STEP 2
#define ARBITRARY_VIEWRANGE_NOHUD 2
//Bloody shoes/footprints
#define MAX_SHOE_BLOODINESS 100
#define BLOODY_FOOTPRINT_BASE_ALPHA 150
#define BLOOD_GAIN_PER_STEP 100
#define BLOOD_LOSS_PER_STEP 5
#define BLOOD_LOSS_IN_SPREAD 20
#define BLOOD_AMOUNT_PER_DECAL 20
//Blood smears
#define BLOOD_SPLATTER_ALPHA_SLIME 150
//Bloody shoe blood states
#define BLOOD_STATE_HUMAN "blood"
#define BLOOD_STATE_XENO "xeno"
#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever"
#define BLOOD_BASE_ALPHA "blood_alpha"
//for obj explosion block calculation
#define EXPLOSION_BLOCK_PROC -1
// Defines for investigate to prevent typos and for styling
#define INVESTIGATE_ATMOS "atmos"
#define INVESTIGATE_BOMB "bombs"
#define INVESTIGATE_CARGO "cargo"
#define INVESTIGATE_GRAVITY "gravity"
#define INVESTIGATE_HOTMIC "hotmic"
#define INVESTIGATE_RADIATION "radiation"
#define INVESTIGATE_RENAME "renames"
#define INVESTIGATE_SINGULO "singulo"
#define INVESTIGATE_SUPERMATTER "supermatter"
#define INVESTIGATE_WIRES "wires"
#define INVESTIGATE_DEATHS "deaths"
// The SQL version required by this version of the code
#define SQL_VERSION 70
// Vending machine stuff
#define CAT_NORMAL (1<<0)
#define CAT_HIDDEN (1<<1)
#define CAT_COIN (1<<2)
// Jobs
// used for alternate_option
#define GET_RANDOM_JOB 0
#define BE_ASSISTANT 1
#define RETURN_TO_LOBBY 2
//Melting Temperatures for various specific objects
#define GIRDER_MELTING_TEMP 5000
// Area selection defines
#define AREASELECT_CORNERA "corner A"
#define AREASELECT_CORNERB "corner B"
// Defib stats
/// Past this much time the patient is unrecoverable (in deciseconds).
#define BASE_DEFIB_TIME_LIMIT (300 SECONDS)
/// Brain damage starts setting in on the patient after some time left rotting.
#define DEFIB_TIME_LOSS (60 SECONDS)
//different types of atom colorations
#define ADMIN_COLOUR_PRIORITY 1 //only used by rare effects like greentext coloring mobs and when admins varedit color
#define TEMPORARY_COLOUR_PRIORITY 2 //e.g. purple effect of the revenant on a mob, black effect when mob electrocuted
#define WASHABLE_COLOUR_PRIORITY 3 //color splashed onto an atom (e.g. paint on turf)
#define FIXED_COLOUR_PRIORITY 4 //color inherent to the atom (e.g. blob color)
#define COLOUR_PRIORITY_AMOUNT 4 //how many priority levels there are.
//Ruin Generation
#define SPACERUIN_MAP_EDGE_PAD 15
#define PLACEMENT_TRIES 100 //How many times we try to fit the ruin somewhere until giving up (really should just swap to some packing algo)
#define PLACE_DEFAULT "random"
#define PLACE_SAME_Z "same"
#define PLACE_SPACE_RUIN "space"
#define PLACE_LAVA_RUIN "lavaland"
//Ghost orbit types:
#define GHOST_ORBIT_CIRCLE "circle"
#define GHOST_ORBIT_TRIANGLE "triangle"
#define GHOST_ORBIT_HEXAGON "hexagon"
#define GHOST_ORBIT_SQUARE "square"
#define GHOST_ORBIT_PENTAGON "pentagon"
//Explosive wall groups
#define EXPLOSIVE_WALL_GROUP_SYNDICATE_BASE "syndicate_base"
/// Prepares a text to be used for maptext. Use this so it doesn't look hideous.
#define MAPTEXT(text) {"<span class='maptext'>[##text]</span>"}
#define MAPTEXT_CENTER(text) {"<span class='maptext' style='text-align: center'>[##text]</span>"}
#define MAPTEXT_SMALL(text) {"<span style='font-family: \"Small Fonts\"; font-size: 12pt; line-height: 0.75; -dm-text-outline: 1px black'>[##text]</span>"}
//Fullscreen overlay resolution in tiles.
#define FULLSCREEN_OVERLAY_RESOLUTION_X 15
#define FULLSCREEN_OVERLAY_RESOLUTION_Y 15
//suit sensors: sensor_mode defines
#define SENSOR_OFF 0
#define SENSOR_LIVING 1
#define SENSOR_VITALS 2
#define SENSOR_COORDS 3
// Dice rigged options.
#define DICE_NOT_RIGGED 1
#define DICE_BASICALLY_RIGGED 2
#define DICE_TOTALLY_RIGGED 3
// Water temperature
#define COLD_WATER_TEMPERATURE 283.15 // 10 degrees celsius
// Parallax
/// About 0.05 Seconds of delay
#define PARALLAX_DELAY_DEFAULT world.tick_lag
#define PARALLAX_DELAY_MED 0.1 SECONDS
#define PARALLAX_DELAY_LOW 0.2 SECONDS
#define PARALLAX_LOOP_TIME 25
// Engine types
#define ENGTYPE_SING "Singularity"
#define ENGTYPE_SM "Supermatter"
#define ENGTYPE_TESLA "Tesla"
#define SUMMON_GUNS "guns"
#define SUMMON_MAGIC "magic"
// Medical stuff
#define SYMPTOM_ACTIVATION_PROB 3
// Atmos stuff that fucking terrifies me
#define LINDA_SPAWN_HEAT (1<<0)
#define LINDA_SPAWN_20C (1<<1)
#define LINDA_SPAWN_TOXINS (1<<2)
#define LINDA_SPAWN_OXYGEN (1<<3)
#define LINDA_SPAWN_CO2 (1<<4)
#define LINDA_SPAWN_NITROGEN (1<<5)
#define LINDA_SPAWN_N2O (1<<6)
#define LINDA_SPAWN_AGENT_B (1<<7)
#define LINDA_SPAWN_AIR (1<<8)
#define LINDA_SPAWN_COLD (1<<9)
#define MAPROTATION_MODE_NORMAL_VOTE "Vote"
#define MAPROTATION_MODE_NO_DUPLICATES "Nodupes"
#define MAPROTATION_MODE_FULL_RANDOM "Random"
#define MAPROTATION_MODE_HYBRID_FPTP_NO_DUPLICATES "FPTP"
/// Send to the primary Discord webhook
#define DISCORD_WEBHOOK_PRIMARY "PRIMARY"
/// Send to the admin Discord webhook
#define DISCORD_WEBHOOK_ADMIN "ADMIN"
/// Send to the mentor Discord webhook
#define DISCORD_WEBHOOK_MENTOR "MENTOR"
// Hallucination severities
#define HALLUCINATE_MINOR 1
#define HALLUCINATE_MODERATE 2
#define HALLUCINATE_MAJOR 3
// Runechat symbol types
#define RUNECHAT_SYMBOL_EMOTE 1
#define RUNECHAT_SYMBOL_LOOC 2
#define RUNECHAT_SYMBOL_DEAD 3
/// Waits at a line of code until X is true
#define UNTIL(X) while(!(X)) sleep(world.tick_lag)
/proc/client_from_var(I)
if(ismob(I))
var/mob/A = I
return A.client
if(isclient(I))
return I
if(istype(I, /datum/mind))
var/datum/mind/B = I
return B.current.client
#define SERVER_MESSAGES_REDIS_CHANNEL "byond.servermessages"
/// Projectile reflectability defines
#define REFLECTABILITY_NEVER 0
#define REFLECTABILITY_PHYSICAL 1
#define REFLECTABILITY_ENERGY 2
// This isnt in client_defines due to scoping issues
#define DEFAULT_CLIENT_VIEWSIZE "19x15"
// Deadchat control defines
/// Will execute a single command after the cooldown based on player votes.
#define DEADCHAT_DEMOCRACY_MODE (1<<0)
/// Allows each player to do a single command every cooldown.
#define DEADCHAT_ANARCHY_MODE (1<<1)
/// Mutes the democracy mode messages send to orbiters at the end of each cycle. Useful for when the cooldown is so low it'd get spammy.
#define MUTE_DEADCHAT_DEMOCRACY_MESSAGES (1<<2)
///Sleep check QDEL. Like sleep check death, but checks deleting. Good for non mobs.
#define SLEEP_CHECK_QDEL(X) sleep(X); if(QDELETED(src)) return;
// Request console message priority defines
#define RQ_NONEW_MESSAGES 0 // RQ_NONEWMESSAGES = no new message
#define RQ_LOWPRIORITY 1 // RQ_LOWPRIORITY = low priority
#define RQ_NORMALPRIORITY 2 // RQ_NORMALPRIORITY = normal priority
#define RQ_HIGHPRIORITY 3 // RQ_HIGHPRIORITY = high priority
/**
* Reading books can help with brain damage!
* These are seperate times so that a user gains more benefits by reading more books,
* but also cant infinitely switch between 1000 books.
*/
/// The amount of time needed to pass to let a single book be read again for brain benefits
#define BRAIN_DAMAGE_BOOK_TIME 45 SECONDS
/// The amount of time a mob needs to wait between any book reading
#define BRAIN_DAMAGE_MOB_TIME 10 SECONDS
/// Takes a datum as input, returns its ref string, or a cached version of it
/// This allows us to cache \ref creation, which ensures it'll only ever happen once per datum, saving string tree time
/// It is slightly less optimal then a []'d datum, but the cost is massively outweighed by the potential savings
/// It will only work for datums mind, for datum reasons
/// : because of the embedded typecheck
#define text_ref(datum) (isdatum(datum) ? (datum:cached_ref ||= "\ref[datum]") : ("\ref[datum]"))
#define ROUND_END_NUCLEAR 1
#define ROUND_END_CREW_TRANSFER 2
#define ROUND_END_FORCED 3
// These used to be integer values but they were never used numerically or even
// stored in SSblackbox using their numeric values, and constantly converting
// them to the actual terror name was redundant and annoying
#define TS_INFESTATION_GREEN_SPIDER "Green Terrors"
#define TS_INFESTATION_PRINCE_SPIDER "Prince Terror"
#define TS_INFESTATION_WHITE_SPIDER "White Terrors"
#define TS_INFESTATION_PRINCESS_SPIDER "Princess Terrors"
#define TS_INFESTATION_QUEEN_SPIDER "Queen Terrors"
#define BIOHAZARD_BLOB "Blob"
#define BIOHAZARD_XENO "Xenomorphs"
#define INCURSION_DEMONS "Demon Incursion"
#define MAX_ALLOWED_TELEPORTS_PER_PROCESS 20
#define CONSTRUCTION_PATH_FORWARDS -1
#define CONSTRUCTION_PATH_BACKWARDS 1
#define CONSTRUCTION_TOOL_BEHAVIOURS list(TOOL_CROWBAR, TOOL_SCREWDRIVER, TOOL_WELDER, TOOL_WRENCH)
#define WEATHER_STARTUP_STAGE 1
#define WEATHER_MAIN_STAGE 2
#define WEATHER_WIND_DOWN_STAGE 3
#define WEATHER_END_STAGE 4
/**
* I dont recommend touching these map generator defines unless you know what you're doing with maze generators.
*/
#define LOG_MAZE_PROGRESS(proc2run, opname) \
do { \
var/timer = start_watch(); \
proc2run ;\
log_debug("\[MAZE] Operation '[opname]' on maze at [x],[y],[z] took [stop_watch(timer)]s"); \
} while(FALSE)
//clusterCheckFlags defines
//All based on clusterMin and clusterMax as guides
//Individual defines
#define MAP_GENERATOR_CLUSTER_CHECK_NONE 0 //No checks are done, cluster as much as possible
#define MAP_GENERATOR_CLUSTER_CHECK_DIFFERENT_TURFS (1<<1) //Don't let turfs of DIFFERENT types cluster
#define MAP_GENERATOR_CLUSTER_CHECK_DIFFERENT_ATOMS (1<<2) //Don't let atoms of DIFFERENT types cluster
#define MAP_GENERATOR_CLUSTER_CHECK_SAME_TURFS (1<<3) //Don't let turfs of the SAME type cluster
#define MAP_GENERATOR_CLUSTER_CHECK_SAME_ATOMS (1<<4) //Don't let atoms of the SAME type cluster
//Combined defines
#define MAP_GENERATOR_CLUSTER_CHECK_SAMES (MAP_GENERATOR_CLUSTER_CHECK_SAME_TURFS | MAP_GENERATOR_CLUSTER_CHECK_SAME_ATOMS) //Don't let any of the same type cluster
#define MAP_GENERATOR_CLUSTER_CHECK_DIFFERENTS (MAP_GENERATOR_CLUSTER_CHECK_DIFFERENT_TURFS | MAP_GENERATOR_CLUSTER_CHECK_DIFFERENT_ATOMS) //Don't let any of different types cluster
#define MAP_GENERATOR_CLUSTER_CHECK_ALL_TURFS (MAP_GENERATOR_CLUSTER_CHECK_DIFFERENT_TURFS | MAP_GENERATOR_CLUSTER_CHECK_SAME_TURFS) //Don't let ANY turfs cluster same and different types
#define MAP_GENERATOR_CLUSTER_CHECK_ALL_ATOMS (MAP_GENERATOR_CLUSTER_CHECK_DIFFERENT_ATOMS | MAP_GENERATOR_CLUSTER_CHECK_SAME_ATOMS) //Don't let ANY atoms cluster same and different types
//All
#define MAP_GENERATOR_CLUSTER_CHECK_ALL ((1<<4) - 2) //Don't let anything cluster, like, at all. -2 because we skipped <<1 for some odd reason.
// Buffer datatype flags.
#define DNA2_BUF_UI (1<<0)
#define DNA2_BUF_UE (1<<1)
#define DNA2_BUF_SE (1<<2)
#define CLONER_BIOMASS_REQUIRED 150
#define SOLAR_MACHINERY_MAX_DIST 40
#define AMMO_BOX_MULTI_SPRITE_STEP_NONE null
#define AMMO_BOX_MULTI_SPRITE_STEP_ON_OFF -1
/// Detective's mode on pinpointers
#define PINPOINTER_MODE_DET 7
/// How frequently disposals can make sounds, to prevent huge sound stacking
#define DISPOSAL_SOUND_COOLDOWN (0.1 SECONDS)
/// The different kinds of voting
#define VOTE_RESULT_TYPE_MAJORITY "Majority"
#define HOLOPAD_MAX_DIAL_TIME 200
#define PROJECTILE_IMPACT_WALL_DENT_HIT 1
#define PROJECTILE_IMPACT_WALL_DENT_SHOT 2
#define ASSEMBLY_WIRE_RECEIVE (1<<0) //Allows pulse(0) to call Activate()
#define ASSEMBLY_WIRE_PULSE (1<<1) //Allows pulse(0) to act on the holder
#define ASSEMBLY_WIRE_PULSE_SPECIAL (1<<2) //Allows pulse(0) to act on the holders special assembly
#define ASSEMBLY_WIRE_RADIO_RECEIVE (1<<3) //Allows pulse(1) to call Activate()
#define ASSEMBLY_WIRE_RADIO_PULSE (1<<4) //Allows pulse(1) to send a radio message
//Types of usual spacevine mutations mutations
#define SPACEVINE_MUTATION_POSITIVE 1
#define SPACEVINE_MUTATION_NEGATIVE 2
#define SPACEVINE_MUTATION_MINOR_NEGATIVE 3
#define RETURN_PRECISE_POSITION(A) new /datum/position(A)
#define RETURN_PRECISE_POINT(A) new /datum/point_precise(A)
#define RETURN_POINT_VECTOR(ATOM, ANGLE, SPEED) (new /datum/point_precise/vector(ATOM, null, null, null, null, ANGLE, SPEED))
#define RETURN_POINT_VECTOR_INCREMENT(ATOM, ANGLE, SPEED, AMT) (new /datum/point_precise/vector(ATOM, null, null, null, null, ANGLE, SPEED, AMT))
#define TEAM_ADMIN_ADD_OBJ_SUCCESS (1<<0)
#define TEAM_ADMIN_ADD_OBJ_CANCEL_LOG (1<<1)
#define TEAM_ADMIN_ADD_OBJ_PURPOSEFUL_CANCEL (1<<2)
/// A helper used by `restrict_file_types.py` to identify types to restrict in a file. Not used by byond at all.
#define RESTRICT_TYPE(type) // do nothing
#define INGREDIENT_CHECK_EXACT 1
#define INGREDIENT_CHECK_FAILURE 0
#define INGREDIENT_CHECK_SURPLUS -1
#define LAVALAND_TENDRIL_COLLAPSE_RANGE 2 //! The radius of the chasm created by killed tendrils.
#define ALPHA_VISIBLE 255 // the max alpha
/// Economy account defines
#define BANK_PIN_MIN 10000
#define BANK_PIN_MAX 99999
/// Defines for hidden organ techs
#define TECH_MATERIAL "materials"
#define TECH_ENGINEERING "engineering"
#define TECH_PLASMA "plasmatech"
#define TECH_POWER "powerstorage"
#define TECH_BLUESPACE "bluespace"
#define TECH_BIO "biotech"
#define TECH_COMBAT "combat"
#define TECH_MAGNETS "magnets"
#define TECH_PROGRAM "programming"
#define TECH_TOXINS "toxins"
#define TECH_SYNDICATE "syndicate"
#define TECH_ABDUCTOR "abductor"
//! The number of seconds between the start of the UNIX and BYOND epochs.
#define BYOND_EPOCH_UNIX 946702800
// Use this define to register something as a purchasable!
// * n — The proper name of the purchasable
// * o — The object type path of the purchasable to spawn
// * p — The price of the purchasable in mining points
#define EQUIPMENT(n, o, p) n = new /datum/data/mining_equipment(n, o, p)
#define BRIDGE_SPAWN_SUCCESS 0
#define BRIDGE_SPAWN_TOO_WIDE 1
#define BRIDGE_SPAWN_TOO_NARROW 2
#define BRIDGE_SPAWN_BAD_TERRAIN 3
#define DIRECT_EXPLOSIVE_TRAP_DEFUSE 1
#define DIRECT_EXPLOSIVE_TRAP_IGNORE 2
#define NODROP_TOGGLE "toggle"
#define DECAL_PAINTER_CATEGORY_STANDARD "Standard"
#define DECAL_PAINTER_CATEGORY_THIN "Thin Lines"
#define DECAL_PAINTER_CATEGORY_THICK "Thick Lines"
#define DECAL_PAINTER_CATEGORY_SQUARE "Square Borders"
#define DECAL_PAINTER_CATEGORY_ALPHANUM "Alphanumeric"