Paradise Station 13 - Modules - TypesVar Details - Proc Details

(global)

Vars

FailsafeFailsafe
MasterStonedMC
SSambienceThe subsystem used to play ambience to users every now and then, makes them real excited.
SSchatCopyright (c) 2020 Aleksej Komarov SPDX-License-Identifier: MIT
SScleanup
SSpersistent_data
SStguitgui subsystem
SStimer
SSverb_managerSSverb_manager, a subsystem that runs every tick and runs through its entire queue without yielding like SSinput. this exists because of how the byond tick works and where user inputted verbs are put within it.

Procs

HTTPGetHTTP Get (Powered by RUSTG)
HeapPathWeightCompareTODO: Macro this to reduce proc overhead
MakeAPICallInternal API Caller
RoundDiagBarDiagnostic HUDs!
_queue_verbqueue a callback for the given verb/verblike proc and any given arguments to the specified verb subsystem, so that they process in the next tick. intended to only work with verbs or verblike procs called directly from client input, use as part of TRY_QUEUE_VERB() and co.
add_attack_logsCreates attack (old and new) logs for the user and defense logs for the target. Will message admins depending on the custom_level, user and target.
addtimerCreate a new timer and insert it in the queue. You should not call this directly, and should instead use the addtimer macro, which includes source information.
announce_merge_conflict_markerWe REALLY do not want un-addressed merge conflicts in maps for an inexhaustible list of reasons. This should help ensure that this will not be missed in case linters fail to catch it for any reason what-so-ever.
bangCreates a flashing effect that blinds and deafens mobs within range
broadcast_messageMessage Broadcast Proc
check_active_security_force
check_rights_allRequires the holder to have all the rights specified
client2rankcolourProc to generate a "rank colour" from a client
compare_listcompare two lists, returns TRUE if they are the same
delete_all_SS_and_recreate_masterDelete all existing SS to basically start over
deltimerDelete a timer
do_teleportWill teleport the given atom to the given destination using the other parameters
emissive_appearanceProduces a mutable appearance glued to the EMISSIVE_PLANE dyed to be the EMISSIVE_COLOR. Order of application matters: Default generated blockers are overlays, and will block its own emissive underlays. If you want an object to be both a blocker, and have their own emissive, it has to be an overlay instead. Grayscale lightmasks are visible in the BYOND right-click and Examine pane, unless they're covered up by another overlay.
emissive_blockerProduces a mutable appearance glued to the EMISSIVE_PLANE dyed to be the EM_BLOCK_COLOR.
empulseWill cause an EMP on the given epicenter. This proc can sleep depending on the affected objects. So assume it sleeps!
fire_flash_logFlashfire is a proc used to log fire causing chemical reactions.
format_si_suffixFormats num with an SI prefix.
get_all_linked_levels_zposProc to get a list of all the linked-together Z-Levels
get_allowed_instrument_idsGet all non admin_only instruments as a list of text ids.
get_antag_type_strings_listA proc that return an array of capitalized strings containing name of the antag types they are
get_antag_type_truncated_plaintext_stringA proc that return a string containing all the singled out antags . Empty string if not antag
get_atoms_of_typeReturns a list of atoms in a location of a given type. Can be refined to look for pixel-shift.
get_bbox_of_atomsGet a bounding box of a list of atoms.
get_channel_nameReturns the clean name of an audio channel.
get_departments_from_jobmatches a string job name to their department(s) and returns it as a list
get_lineGet a list of turfs in a line from starting_atom to ending_atom.
get_living_playersThis proc returns every player with a client who is not a ghost or a new_player
get_nested_locsReturns a list of all locations (except the area) the movable is within.
get_path_toThis file contains the stuff you need for using JPS (Jump Point Search) pathing, an alternative to A* that skips over large numbers of uninteresting tiles resulting in much quicker pathfinding solutions.
get_rad_contentsA special GetAllContents that doesn't search past things with rad insulation Components which return COMPONENT_BLOCK_RADIATION prevent further searching into that object's contents. The object itself will get returned still. The ignore list makes those objects never return at all
get_ranged_target_turf_directGet ranged target turf, but with direct targets as opposed to directions
get_valid_vent_spawnsReturns a list of vents that can be used as a potential spawn if they meet the criteria set by the arguments
goonchem_vortexThrows or pulls objects to/from a chem reaction
icon_existsChecks if the given iconstate exists in the given file, caching the result. Setting no_sprite to TRUE will print a stack trace ONCE.
is_bad_connectionConnection checker
is_color_darkGiven a color in the format of "#RRGGBB", will return if the color is dark.
is_special_characterADMIN HELPER PROCS A proc that return whether the mob is a "Special Character" aka Antagonist
is_type_in_UID_listIf the list L contains a datum UID who's type matches D's type, returns the UID of that datum in the list. Otherwise returns null.
locateUIDLocates a datum based off of the UID
makeDatumRefListsInitial Building
make_associativeA proc for turning a list into an associative list.
message_adminTicketSends a message to the staff able to see admin tickets Arguments: msg - The message being send important - If the message is important. If TRUE it will ignore the CHAT_NO_TICKETLOGS preferences, send a sound and flash the window. Defaults to FALSE
message_mentorTicketSends a message to the staff able to see mentor tickets Arguments: msg - The message being send important - If the message is important. If TRUE it will ignore the CHAT_NO_TICKETLOGS preferences, send a sound and flash the window. Defaults to FALSE
message_to_htmlMessage-related procs
pick_multiple_uniquePicks multiple unique elements from the suplied list. If the given list has a length less than the amount given then it will return a list with an equal amount
pick_unique_lawsetreturns a random non starting / kill crew lawset if the station has a unique ai lawset
pickweightPicks an element based on its weight. L - The input list
play_cinematicPlays a cinematic, duh. Can be to a select few people, or everyone.
propagate_networkremove the old powernet and replace it with a new one throughout the network.
radial_menu_helperSimilar to show_radial_menu, but choices is a list of atoms, for which icons will be automatically generated. Supports multiple items of the same name, 2 soaps will become soap (1) and soap (2) to the user. Otherwise, has the exact same arguments as show_radial_menu
random_body_accessoryReturns a random body accessory for a given species name. Can be null based on is_optional argument.
recover_all_SS_and_recreate_masterRecreate all SSs which will still cause data survive due to Recover(), the new Master will then find and take them from global.vars
rustg_get_versionGets the version of rust_g
rustg_redis_disconnect_rqDisconnects from a previously connected redis server
rustg_ss220_get_versionGets the version of rust_g
rustg_unix_timestampReturns the timestamp as a string
safe_get_ckeySafe ckey getter
seconds_to_clockTake a value in seconds and makes it display like a clock. Hours are stripped. (mm:ss)
seconds_to_full_clockTake a value in seconds and makes it display like a clock (h:mm:ss)
seedifyThis proc could probably be scoped better, also it's logic is cursed and hard to understand
setup_mod_themesGlobal proc that sets up all MOD themes as singletons in a list and returns it.
setupcult.
shake_cameraShake the camera of the person viewing the mob SO REAL!
show_blurbShows a ticker reading out the given text on a client's screen.
spread_germs_by_incisionSpread germs directly from a tool.
spread_germs_to_organSpread some nasty germs to an organ.
start_watchReturns "watch handle" (really just a timestamp :V)
stop_watchReturns number of seconds elapsed. @param wh number The "Watch Handle" from start_watch(). (timestamp)
tgui_TopicMiddleware for /client/Topic.
tgui_input_listCreates a TGUI input list window and returns the user's response.
tgui_input_list_asyncClient does NOT have tgui_input on: Returns regular input Creates an asynchronous TGUI input list window with an associated callback.
to_chatSends the message to the recipient (target).
to_chat_immediateCircumvents the message queue and sends the message to the recipient (target) as soon as possible. trailing_newline, confidential, and handle_whitespace currently have no effect, please fix this in the future or remove the arguments to lower cache!
wiki_linkCreates a hyperlink for a specified wiki article.

Var Details

Failsafe

Failsafe

Pretty much pokes the MC to make sure it's still alive.

Master

StonedMC

Designed to properly split up a given tick among subsystems Note: if you read parts of this code and think "why is it doing it that way" Odds are, there is a reason

SSambience

The subsystem used to play ambience to users every now and then, makes them real excited.

SSchat

Copyright (c) 2020 Aleksej Komarov SPDX-License-Identifier: MIT

SScleanup

Cleanup Subsystem

For now, all it does is periodically clean the supplied global lists of any null values they may contain.

Why is this important?

Sometimes, these lists can gain nulls due to errors. For example, when a dead player trasitions from the dead_mob_list to the alive_mob_list, a null value may get stuck in the dead mob list. This can cause issues when other code tries to do things with the values in the list, but are instead met with null values. These problems are incredibly hard to track down and fix, so this subsystem is a solution to that.

SSpersistent_data

Persistent Data Subsystem

Provides a centralised handler for persistent data reading and writing. The subsystem does not do any actual spawning itself, as this focuses on objects and mobs Should anything that is turf persistence related added in, that can be chucked into this SS Its quite a simple subsystem. For now, anyways.

SStgui

tgui subsystem

Contains all tgui state and subsystem code.

Copyright (c) 2020 Aleksej Komarov SPDX-License-Identifier: MIT

SStimer

Timer Subsystem

Handles creation, callbacks, and destruction of timed events.

It is important to understand the buckets used in the timer subsystem are just a series of doubly-linked lists. The object at a given index in bucket_list is a /datum/timedevent, the head of a list, which has prev and next references for the respective elements in that bucket's list.

SSverb_manager

SSverb_manager, a subsystem that runs every tick and runs through its entire queue without yielding like SSinput. this exists because of how the byond tick works and where user inputted verbs are put within it.

see TICK_ORDER.md for more info on how the byond tick is structured.

The way the MC allots its time is via TICK_LIMIT_RUNNING, it simply subtracts the cost of SendMaps (MAPTICK_LAST_INTERNAL_TICK_USAGE) plus TICK_BYOND_RESERVE from the tick and uses up to that amount of time (minus the percentage of the tick used by the time it executes subsystems) on subsystems running cool things like atmospherics or Life or SSInput or whatever.

Without this subsystem, verbs are likely to cause overtime if the MC uses all of the time it has alloted for itself in the tick, and SendMaps uses as much as its expected to, and an expensive verb ends up executing that tick. This is because the MC is completely blind to the cost of verbs, it can't account for it at all. The only chance for verbs to not cause overtime in a tick where the MC used as much of the tick as it alloted itself and where SendMaps costed as much as it was expected to is if the verb(s) take less than TICK_BYOND_RESERVE percent of the tick, which isnt much. Not to mention if SendMaps takes more than 30% of the tick and the MC forces itself to take at least 70% of the normal tick duration which causes ticks to naturally overrun even in the absence of verbs.

With this subsystem, the MC can account for the cost of verbs and thus stop major overruns of ticks. This means that the most important subsystems like SSinput can start at the same time they were supposed to, leading to a smoother experience for the player since ticks arent riddled with minor hangs over and over again.

Proc Details

HTTPGet

HTTP Get (Powered by RUSTG)

This proc should be used as a replacement for [world.Export()] due to an underlying issue with it. See: https://www.byond.com/forum/post/2772166 The one thing you will need to be aware of is that this no longer wraps the response inside a "file", so anything that relies on a file2text() unwrap will need tweaking. RUST HTTP also has better support for HTTPS as well as weird quirks with modern webservers. Returns an assoc list that follows the standard [world.Export()] format (https://secure.byond.com/docs/ref/index.html#/world/proc/Export), with the above exception

Arguments:

HeapPathWeightCompare

TODO: Macro this to reduce proc overhead

MakeAPICall

Internal API Caller

Makes calls to the internal Paradise API and returns a /datum/http_response.

Arguments:

RoundDiagBar

Diagnostic HUDs!

_queue_verb

queue a callback for the given verb/verblike proc and any given arguments to the specified verb subsystem, so that they process in the next tick. intended to only work with verbs or verblike procs called directly from client input, use as part of TRY_QUEUE_VERB() and co.

returns TRUE if the queuing was successful, FALSE otherwise.

add_attack_logs

Creates attack (old and new) logs for the user and defense logs for the target. Will message admins depending on the custom_level, user and target.

custom_level will determine the log level set. Unless the target is SSD and there is a user doing it If custom_level is not set then the log level will be determined using the user and the target.

addtimer

Create a new timer and insert it in the queue. You should not call this directly, and should instead use the addtimer macro, which includes source information.

Arguments:

announce_merge_conflict_marker

We REALLY do not want un-addressed merge conflicts in maps for an inexhaustible list of reasons. This should help ensure that this will not be missed in case linters fail to catch it for any reason what-so-ever.

bang

Creates a flashing effect that blinds and deafens mobs within range

Arguments:

broadcast_message

Message Broadcast Proc

This big fat disaster is responsible for sending the message out to all headsets and radios on the station It is absolutely disgusting, but used to take about 20 arguments before I slimmed it down to just one Arguments:

check_active_security_force

check_rights_all

Requires the holder to have all the rights specified

rights_required = R_ADMIN|R_EVENT means they must have both flags, or it will return false

client2rankcolour

Proc to generate a "rank colour" from a client

This takes the client and looks at various factors in order, such as patreon status, staff rank, and more Arguments:

compare_list

compare two lists, returns TRUE if they are the same

delete_all_SS_and_recreate_master

Delete all existing SS to basically start over

deltimer

Delete a timer

Arguments:

do_teleport

Will teleport the given atom to the given destination using the other parameters

Arguments:

emissive_appearance

Produces a mutable appearance glued to the EMISSIVE_PLANE dyed to be the EMISSIVE_COLOR. Order of application matters: Default generated blockers are overlays, and will block its own emissive underlays. If you want an object to be both a blocker, and have their own emissive, it has to be an overlay instead. Grayscale lightmasks are visible in the BYOND right-click and Examine pane, unless they're covered up by another overlay.

emissive_blocker

Produces a mutable appearance glued to the EMISSIVE_PLANE dyed to be the EM_BLOCK_COLOR.

empulse

Will cause an EMP on the given epicenter. This proc can sleep depending on the affected objects. So assume it sleeps!

epicenter - The center of the EMP. Can be an atom, as long as the given atom is on a turf (in)directly heavy_range - The max distance from the epicenter where objects will be get heavy EMPed light_range - The max distance from the epicenter where objects will get light EMPed log - Whether or not this action should be logged or not. Will use the cause if provided cause - The cause of the EMP. Used for the logging

fire_flash_log

Flashfire is a proc used to log fire causing chemical reactions.

Call this whenever you have a chemical reaction that makes fire flashes. Arguments:

format_si_suffix

Formats num with an SI prefix.

Returns a string formatted with a multiple of num and an SI prefix corresponding to an exponent of 10. Only considers exponents that are multiples of 3 (deca, deci, hecto, and centi are not included). A unit is not included in the string, the prefix is placed after the number with no spacing added anywhere. Listing of prefixes: https://en.wikipedia.org/wiki/Metric_prefix#List_of_SI_prefixes

get_all_linked_levels_zpos

Proc to get a list of all the linked-together Z-Levels

Returns a list of zlevel numbers which can be accessed from travelling space naturally

get_allowed_instrument_ids

Get all non admin_only instruments as a list of text ids.

get_antag_type_strings_list

A proc that return an array of capitalized strings containing name of the antag types they are

Arguments:

get_antag_type_truncated_plaintext_string

A proc that return a string containing all the singled out antags . Empty string if not antag

Usually, you'd return a FALSE, but since this is consumed by javascript you're in for a world of hurt if you pass a byond FALSE which get converted into a fucking string anyway and pass for TRUE in check. Fuck. It always append "(May be other antag)" Arguments:

get_atoms_of_type

Returns a list of atoms in a location of a given type. Can be refined to look for pixel-shift.

Arguments:

get_bbox_of_atoms

Get a bounding box of a list of atoms.

Arguments:

Returns: list(x1, y1, x2, y2)

get_channel_name

Returns the clean name of an audio channel.

Arguments:

get_departments_from_job

matches a string job name to their department(s) and returns it as a list

get_line

Get a list of turfs in a line from starting_atom to ending_atom.

Uses the ultra-fast Bresenham Line-Drawing Algorithm.

get_living_players

This proc returns every player with a client who is not a ghost or a new_player

get_nested_locs

Returns a list of all locations (except the area) the movable is within.

get_path_to

This file contains the stuff you need for using JPS (Jump Point Search) pathing, an alternative to A* that skips over large numbers of uninteresting tiles resulting in much quicker pathfinding solutions.

This is the proc you use whenever you want to have pathfinding more complex than "try stepping towards the thing". If no path was found, returns an empty list, which is important for bots like medibots who expect an empty list rather than nothing.

Arguments:

get_rad_contents

A special GetAllContents that doesn't search past things with rad insulation Components which return COMPONENT_BLOCK_RADIATION prevent further searching into that object's contents. The object itself will get returned still. The ignore list makes those objects never return at all

get_ranged_target_turf_direct

Get ranged target turf, but with direct targets as opposed to directions

Starts at atom starting_atom and gets the exact angle between starting_atom and target Moves from starting_atom with that angle, Range amount of times, until it stops, bound to map size Arguments:

get_valid_vent_spawns

Returns a list of vents that can be used as a potential spawn if they meet the criteria set by the arguments

Will not include parent-less vents to the returned list. Arguments:

goonchem_vortex

Throws or pulls objects to/from a chem reaction

Scales the amount of objects thrown with the volume, unless ignore_volume is TRUE

Arguments:

icon_exists

Checks if the given iconstate exists in the given file, caching the result. Setting no_sprite to TRUE will print a stack trace ONCE.

is_bad_connection

Connection checker

Checks the connection frequency against the intended frequency for the message NOTE: I barely know what on earth this does, but it works and it scares me Arguments:

is_color_dark

Given a color in the format of "#RRGGBB", will return if the color is dark.

is_special_character

ADMIN HELPER PROCS A proc that return whether the mob is a "Special Character" aka Antagonist

Arguments:

is_type_in_UID_list

If the list L contains a datum UID who's type matches D's type, returns the UID of that datum in the list. Otherwise returns null.

locateUID

Locates a datum based off of the UID

Replacement for locate() which takes a UID instead of a ref Returns the datum, if found

makeDatumRefLists

Initial Building

make_associative

A proc for turning a list into an associative list.

A simple proc for turning all things in a list into an associative list, instead Each item in the list will have an associative value of TRUE

Arguments:

message_adminTicket

Sends a message to the staff able to see admin tickets Arguments: msg - The message being send important - If the message is important. If TRUE it will ignore the CHAT_NO_TICKETLOGS preferences, send a sound and flash the window. Defaults to FALSE

message_mentorTicket

Sends a message to the staff able to see mentor tickets Arguments: msg - The message being send important - If the message is important. If TRUE it will ignore the CHAT_NO_TICKETLOGS preferences, send a sound and flash the window. Defaults to FALSE

message_to_html

Message-related procs

Message format (/list):

Copyright (c) 2020 Aleksej Komarov SPDX-License-Identifier: MIT

pick_multiple_unique

Picks multiple unique elements from the suplied list. If the given list has a length less than the amount given then it will return a list with an equal amount

Arguments:

pick_unique_lawset

returns a random non starting / kill crew lawset if the station has a unique ai lawset

pickweight

Picks an element based on its weight. L - The input list

example: list("a" = 1, "b" = 2) will pick "b" 2/3s of the time

play_cinematic

Plays a cinematic, duh. Can be to a select few people, or everyone.

cinematic_type - datum typepath to what cinematic you wish to play. watchers - a list of all mobs you are playing the cinematic to. If world, the cinematical will play globally to all players. special_callback - optional callback to be invoked mid-cinematic.

propagate_network

remove the old powernet and replace it with a new one throughout the network.

radial_menu_helper

Similar to show_radial_menu, but choices is a list of atoms, for which icons will be automatically generated. Supports multiple items of the same name, 2 soaps will become soap (1) and soap (2) to the user. Otherwise, has the exact same arguments as show_radial_menu

random_body_accessory

Returns a random body accessory for a given species name. Can be null based on is_optional argument.

Arguments:

recover_all_SS_and_recreate_master

Recreate all SSs which will still cause data survive due to Recover(), the new Master will then find and take them from global.vars

rustg_get_version

Gets the version of rust_g

rustg_redis_disconnect_rq

Disconnects from a previously connected redis server

rustg_ss220_get_version

Gets the version of rust_g

rustg_unix_timestamp

Returns the timestamp as a string

safe_get_ckey

Safe ckey getter

Should be used whenever broadcasting public information about a mob, as this proc will make a best effort to hide the users ckey if they request it. It will first check the mob for a client, then use the mobs last ckey as a directory lookup. If a client cant be found to check preferences on, it will just show as DC'd. This proc should only be used for public facing stuff, not administration related things.

Arguments:

seconds_to_clock

Take a value in seconds and makes it display like a clock. Hours are stripped. (mm:ss)

seconds_to_full_clock

Take a value in seconds and makes it display like a clock (h:mm:ss)

seedify

This proc could probably be scoped better, also it's logic is cursed and hard to understand

setup_mod_themes

Global proc that sets up all MOD themes as singletons in a list and returns it.

setupcult

.

shake_camera

Shake the camera of the person viewing the mob SO REAL!

show_blurb

Shows a ticker reading out the given text on a client's screen.

targets = mob or list of mobs to show it to. duration = how long it lingers after it finishes ticking. message = the message to display. Due to using maptext it isn't very flexible format-wise. 11px font, up to 480 pixels per line. Use \n for line breaks. Single-character HTML tags (, , etc.) are handled correctly but others display strangely. Note that maptext can display text macros in strange ways, ex. \improper showing as "ÿ". Lines containing only spaces, including ones only containing "\improper ", don't display. scroll_down = by default each line pushes the previous line upwards - this tells it to start high and scroll down. Ticks on \n - does not autodetect line breaks in long strings. screen_position = screen loc for the bottom-left corner of the blurb. text_alignment = "right", "left", or "center" text_color = colour of the text. blurb_key = a key used for specific blurb types so they are not shown repeatedly. ignore_key = used to skip key checks. text_limit = limit in characters of the message.

spread_germs_by_incision

Spread germs directly from a tool.

  • E - An external organ being operated on.
  • tool - The tool performing the operation.

spread_germs_to_organ

Spread some nasty germs to an organ.

  • target_organ - The organ to try spreading germs to.
  • user - The user who's manipulating the organ.
  • tool - The tool the user is using to mess with the organ.

start_watch

Returns "watch handle" (really just a timestamp :V)

stop_watch

Returns number of seconds elapsed. @param wh number The "Watch Handle" from start_watch(). (timestamp)

tgui_Topic

Middleware for /client/Topic.

return bool If TRUE, prevents propagation of the topic call.

tgui_input_list

Creates a TGUI input list window and returns the user's response.

This proc should be used to create alerts that the caller will wait for a response from. Arguments:

  • user - The user to show the input box to.
  • message - The content of the input box, shown in the body of the TGUI window.
  • title - The title of the input box, shown on the top of the TGUI window.
  • buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
  • timeout - The timeout of the input box, after which the input box will close and qdel itself. Set to zero for no timeout.

tgui_input_list_async

Client does NOT have tgui_input on: Returns regular input Creates an asynchronous TGUI input list window with an associated callback.

This proc should be used to create inputs that invoke a callback with the user's chosen option. Arguments:

  • user - The user to show the input box to.
  • message - The content of the input box, shown in the body of the TGUI window.
  • title - The title of the input box, shown on the top of the TGUI window.
  • buttons - The options that can be chosen by the user, each string is assigned a button on the UI.
  • callback - The callback to be invoked when a choice is made.
  • timeout - The timeout of the input box, after which the menu will close and qdel itself. Set to zero for no timeout.

to_chat

Sends the message to the recipient (target).

Recommended way to write to_chat calls:

to_chat(client, "You have found <strong>[object]</strong>", MESSAGE_TYPE_INFO,

Always remember to close spans! TARGET: Refers to the target of the to_chat message. Valid targets include clients, mobs, and the static world controller HTML: The Message to be sent to the TARGET. Converted to a string if not already one in this function TYPE: The chat tab that this message will be sent to, a list of all valid types can be found in chat.dm TEXT: Unused AVOID_HIGHLIGHTING: Unused trailing_newline, confidential, and handle_whitespace currently have no effect, please fix this in the future or remove the arguments to lower cache!

to_chat_immediate

Circumvents the message queue and sends the message to the recipient (target) as soon as possible. trailing_newline, confidential, and handle_whitespace currently have no effect, please fix this in the future or remove the arguments to lower cache!

Creates a hyperlink for a specified wiki article.