//A set of constants used to determine which type of mute an admin wishes to apply:
//Please read and understand the muting/automuting stuff before changing these. MUTE_IC_AUTO etc = (MUTE_IC << 1)
//Therefore there needs to be a gap between the flags for the automute flags
#define MUTE_IC (1<<0)
#define MUTE_OOC (1<<1)
#define MUTE_PRAY (1<<2)
#define MUTE_ADMINHELP (1<<3)
#define MUTE_DEADCHAT (1<<4)
#define MUTE_INTERNET_REQUEST (1<<5)
// Skyrat Edit Addition - Mute LOOC
#define MUTE_LOOC (1<<6)
// Skyrat Edit End
#define MUTE_ALL ALL
//Some constants for DB_Ban
#define BANTYPE_PERMA 1
#define BANTYPE_TEMP 2
#define BANTYPE_JOB_PERMA 3
#define BANTYPE_JOB_TEMP 4
/// used to locate stuff to unban.
#define BANTYPE_ANY_FULLBAN 5
#define BANTYPE_ADMIN_PERMA 7
#define BANTYPE_ADMIN_TEMP 8
/// used to remove jobbans
#define BANTYPE_ANY_JOB 9
//Admin Permissions
/// Used for signifying that all admins can use this regardless of actual permissions
#define R_NONE NONE
#define R_BUILD (1<<0)
#define R_ADMIN (1<<1)
#define R_BAN (1<<2)
#define R_FUN (1<<3)
#define R_SERVER (1<<4)
#define R_DEBUG (1<<5)
#define R_POSSESS (1<<6)
#define R_PERMISSIONS (1<<7)
#define R_STEALTH (1<<8)
#define R_POLL (1<<9)
#define R_VAREDIT (1<<10)
#define R_SOUND (1<<11)
#define R_SPAWN (1<<12)
#define R_AUTOADMIN (1<<13)
#define R_DBRANKS (1<<14)
#define R_DEFAULT R_AUTOADMIN
#define R_EVERYTHING (1<<15)-1 //the sum of all other rank permissions, used for +EVERYTHING
#define ADMIN_QUE(user) "(?)"
#define ADMIN_FLW(user) "(FLW)"
#define ADMIN_PP(user) "(PP)"
#define ADMIN_VV(atom) "(VV)"
#define ADMIN_SM(user) "(SM)"
#define ADMIN_TP(user) "(TP)"
#define ADMIN_SP(user) "(SP)"
#define ADMIN_KICK(user) "(KICK)"
#define ADMIN_CENTCOM_REPLY(user) "(RPLY)"
#define ADMIN_SYNDICATE_REPLY(user) "(RPLY)"
#define ADMIN_SC(user) "(SC)"
#define ADMIN_SMITE(user) "(SMITE)"
#define ADMIN_LOOKUP(user) "[key_name_admin(user)][ADMIN_QUE(user)]"
#define ADMIN_LOOKUPFLW(user) "[key_name_admin(user)][ADMIN_QUE(user)] [ADMIN_FLW(user)]"
#define ADMIN_SET_SD_CODE "(SETCODE)"
#define ADMIN_FULLMONTY_NONAME(user) "[ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)] [ADMIN_INDIVIDUALLOG(user)] [ADMIN_SMITE(user)]"
#define ADMIN_FULLMONTY(user) "[key_name_admin(user)] [ADMIN_FULLMONTY_NONAME(user)]"
#define ADMIN_JMP(src) "(JMP)"
#define COORD(src) "[src ? src.Admin_Coordinates_Readable() : "nonexistent location"]"
#define AREACOORD(src) "[src ? src.Admin_Coordinates_Readable(TRUE) : "nonexistent location"]"
#define ADMIN_COORDJMP(src) "[src ? src.Admin_Coordinates_Readable(FALSE, TRUE) : "nonexistent location"]"
#define ADMIN_VERBOSEJMP(src) "[src ? src.Admin_Coordinates_Readable(TRUE, TRUE) : "nonexistent location"]"
#define ADMIN_INDIVIDUALLOG(user) "(LOGS)"
#define ADMIN_TAG(datum) "(TAG)"
#define ADMIN_LUAVIEW(state) "(VIEW STATE)"
#define ADMIN_LUAVIEW_CHUNK(state, log_index) "(VIEW CODE)"
/// Displays "(SHOW)" in the chat, when clicked it tries to show atom(paper). First you need to set the request_state variable to TRUE for the paper.
#define ADMIN_SHOW_PAPER(atom) "(SHOW)"
/// Displays "(PRINT)" in the chat, when clicked it will try to print the atom(paper) on the CentCom/Syndicate fax machine.
#define ADMIN_PRINT_FAX(atom, sender, destination) "(PRINT)"
/// Displays "(PLAY)" in the chat, when clicked it tries to play internet sounds from the request.
#define ADMIN_PLAY_INTERNET(text, credit) "(PLAY)"
/// Displays "(SEE Z-LEVEL LAYOUT)" in the chat, when clicked it shows the z-level layouts for the current world state.
#define ADMIN_SEE_ZLEVEL_LAYOUT "(SEE Z-LEVEL LAYOUT)"
/atom/proc/Admin_Coordinates_Readable(area_name, admin_jump_ref)
var/turf/turf_at_coords = Safe_COORD_Location()
return turf_at_coords ? "[area_name ? "[get_area_name(turf_at_coords, TRUE)] " : " "]([turf_at_coords.x],[turf_at_coords.y],[turf_at_coords.z])[admin_jump_ref ? " [ADMIN_JMP(turf_at_coords)]" : ""]" : "nonexistent location"
/atom/proc/Safe_COORD_Location()
var/atom/drop_atom = drop_location()
if(!drop_atom)
return //not a valid atom.
var/turf/drop_turf = get_step(drop_atom, 0) //resolve where the thing is.
if(!drop_turf) //incase it's inside a valid drop container, inside another container. ie if a mech picked up a closet and has it inside its internal storage.
var/atom/last_try = drop_atom.loc?.drop_location() //one last try, otherwise fuck it.
if(last_try)
drop_turf = get_step(last_try, 0)
return drop_turf
/turf/Safe_COORD_Location()
return src
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
#define AHELP_RESOLVED 3
// Page numbers for the Permission Panel
#define PERMISSIONS_PAGE_PERMISSIONS 1
#define PERMISSIONS_PAGE_RANKS 2
#define PERMISSIONS_PAGE_LOGGING 3
#define PERMISSIONS_PAGE_HOUSEKEEPING 4
// Actions that can be logged in the admin_log table, excepting NONE
#define PERMISSIONS_ACTION_ADMIN_ADDED "add admin"
#define PERMISSIONS_ACTION_ADMIN_REMOVED "remove admin"
#define PERMISSIONS_ACTION_ADMIN_RANK_CHANGED "change admin rank"
#define PERMISSIONS_ACTION_RANK_ADDED "add rank"
#define PERMISSIONS_ACTION_RANK_REMOVED "remove rank"
#define PERMISSIONS_ACTION_RANK_CHANGED "change rank flags"
#define PERMISSIONS_ACTION_NONE "none"
// The types of ranks you can have
#define RANK_SOURCE_LOCAL "rank_local"
#define RANK_SOURCE_TXT "rank_txt"
#define RANK_SOURCE_DB "rank_db"
#define RANK_SOURCE_BACKUP "rank_backup"
#define RANK_SOURCE_TEMPORARY "rank_temp"
/// Amount of time after the round starts that the player disconnect report is issued.
#define ROUNDSTART_LOGOUT_REPORT_TIME (21 MINUTES) // SKYRAT EDIT CHANGE - ORIGINAL: 10 MINUTES
/// Threshold in minutes for counting a player as AFK on the roundstart report.
#define ROUNDSTART_LOGOUT_AFK_THRESHOLD (ROUNDSTART_LOGOUT_REPORT_TIME * 0.7)
/// Number of identical messages required before the spam-prevention will warn you to stfu
#define SPAM_TRIGGER_WARNING 5
/// Number of identical messages required before the spam-prevention will automute you
#define SPAM_TRIGGER_AUTOMUTE 10
///Max length of a keypress command before it's considered to be a forged packet/bogus command
#define MAX_KEYPRESS_COMMANDLENGTH 16
///Maximum keys that can be bound to one button
#define MAX_COMMANDS_PER_KEY 5
///Max amount of keypress messages per second over two seconds before client is autokicked
#define MAX_KEYPRESS_AUTOKICK 50
///Length of held key buffer
#define HELD_KEY_BUFFER_LENGTH 15
#define STICKYBAN_DB_CACHE_TIME (10 SECONDS)
#define STICKYBAN_ROGUE_CHECK_TIME 5
/// Reference index for policy.json to locate any policy text applicable to polymorphed/staff of changed mobs.
#define POLICY_POLYMORPH "Polymorph"
/// Reference index for policy.json to locate any policy text that is shown as a header in the OOC > Show Policy verb.
#define POLICY_VERB_HEADER "Policy Verb Header"
//How many things you can spawn at once with spawn verb/create panel
#define ADMIN_SPAWN_CAP 100
// LOG BROWSE TYPES
#define BROWSE_ROOT_ALL_LOGS 1
#define BROWSE_ROOT_CURRENT_LOGS 2
// allowed ghost roles this round, starts as everything allowed
GLOBAL_VAR_INIT(ghost_role_flags, ALL)
//Flags that control what ways ghosts can get back into the round
//ie fugitives, space dragon, etc. also includes dynamic midrounds as it's the same deal
#define GHOSTROLE_MIDROUND_EVENT (1<<0)
//ie ashwalkers, free golems, beach bums
#define GHOSTROLE_SPAWNER (1<<1)
//ie mind monkeys, sentience potion
#define GHOSTROLE_STATION_SENTIENCE (1<<2)
//ie pais, posibrains
#define GHOSTROLE_SILICONS (1<<3)
//ie mafia, ctf
#define GHOSTROLE_MINIGAME (1<<4)
//smite defines
#define LIGHTNING_BOLT_DAMAGE 75
#define LIGHTNING_BOLT_ELECTROCUTION_ANIMATION_LENGTH 40
/// for [/proc/check_asay_links], if there are any actionable refs in the asay message, this index in the return list contains the new message text to be printed
#define ASAY_LINK_NEW_MESSAGE_INDEX "!asay_new_message"
/// for [/proc/check_asay_links], if there are any admin pings in the asay message, this index in the return list contains a list of admins to ping
#define ASAY_LINK_PINGED_ADMINS_INDEX "!pinged_admins"
/// When passed in as the duration for ban_panel, will make the ban default to permanent
#define BAN_PANEL_PERMANENT "permanent"
/// A value for /datum/admins/cached_feedback_link to indicate empty, rather than unobtained
#define NO_FEEDBACK_LINK "no_feedback_link"
/// State when an interview has been approved
#define INTERVIEW_APPROVED "interview_approved"
/// State when an interview as been denied
#define INTERVIEW_DENIED "interview_denied"
/// State when an interview has had no action on it yet
#define INTERVIEW_PENDING "interview_pending"
/// Used in logging uses of admin verbs (and sometimes some non-admin or debug verbs) to the blackbox
/// Only pass it a string key, the verb being used.
#define BLACKBOX_LOG_ADMIN_VERB(the_verb) SSblackbox.record_feedback("tally", "admin_verb", 1, the_verb)
// Smite flags
/// Plays sfx and adds an overlay to the target
#define SMITE_DIVINE (1<<0)
/// Adds a delay before the effect is applied
#define SMITE_DELAY (1<<1)
/// Stuns the target for a short duration, ignores stun immunity
#define SMITE_STUN (1<<2)