Difference between revisions of "Packets"

From Space Station 13 Wiki
Jump to navigation Jump to search
(Adds Wireless Network section from Zamu's Station Network guide)
m (Fixing incorrect guardbuddy docking station download command description, `model=` uses text2num_safe to parse the value which will error out if a different type of value is passed (https://github.com/goonstation/goonstation/blob/b28cf3ee6560dcc45f9b9161eb77ffcb15dcee63/code/modules/robotics/bot/guardbot.dm#L4478))
 
(63 intermediate revisions by 25 users not shown)
Line 1: Line 1:
Almost all network traffic is in the form of radio signals, more commonly referred to as '''packets'''. With the right tools, it is possible to intercept, craft, and forge your own signals for various purposes.
Welcome to the art of '''packets'''. Many of the machines you see in the game use radio signals, commonly called "packets" or more rarely just "signals", to perform certain functions. The art of intercepting and crafting your own signals for various purposes is called "packet-hacking". Packet hacking is a very powerful tool which can be used to escape or break into places, among other uses.
 
==Rules==
==Rules==
'''Hack responsibly!'''
'''Hack responsibly!'''


Like [[Hacking|mechanical hacking]], the act of packet-hacking is not in of itself a violation of the rules or a crime Security could persecute you for. ''However'', if you use packet-hacking to commit crime, e.g. using packets to break into [[Security (place)|Security]], then crew are well within their right to try to stop you, and Security is allowed to punish you for it. In addition, there are some crimes that are technically within the rules but will get you yelled at by an [[Admin]] if you make a habit of doing it, e.g. breaking into sensitive places (e.g. [[AI Upload]], [[Security (place)|Security]] in general, [[Armory]] specifically) or stealing vital job equipment (e.g. the [[Captain]]'s spare ID).
Like [[Hacking|mechanical hacking]], packet-hacking is not in of itself a violation of the rules or a crime Security could persecute you for. It is not considered [[Grief]] in the same way, say, bombing something could be, and you do not need to be antagonist to use packets.
 
''However'', if you use packet-hacking to commit crime, e.g. using packets to break into the [[Research Sector]], then crew are well within their right to try to stop you, and Security is allowed to punish you for it.  
 
In addition, if you use packet-hacking to break into sensitive places (e.g. [[AI Upload]], [[Security (place)|Security]] in general, [[Armory]] specifically), steal vital job equipment (e.g. the [[Captain]]'s spare ID), or commit other borderline [[Grief]] acts, you can be yelled at by an [[Admin]] or even banned from the game for a while, especially if you make a habit of doing it.


==Packet Tools==
==Packet Tools==
Line 29: Line 33:


====FROG====
====FROG====
Allows you to ping and connect to other terminals in a manner similar to [[DWAINE]]. Bear in mind that the [[Research Mainframe]] is on a physically separate network from the rest of the station. FROG will not recognize a wireless card.
Allows you to ping and connect to other terminals in a manner similar to [[DWAINE]]. Bear in mind that the [[Research Mainframe]] is [[Zeta_Research_Station|very occasionally]] on a physically separate network from the rest of the station. FROG will not recognize a wireless card. You can use this allow a ThinkDOS computer to act like a TermOS terminal, i.e. it can connect to the mainframe.


====Ping====
====Ping====
Line 36: Line 40:
===Hardware===
===Hardware===
====Data Terminal====
====Data Terminal====
[[File:DataTerminal.png|frame|left]]
[[File:DataTerminalV2.png]]
 
This is the physical link to the wired network. A computer must be built on top of it to access that network. The most obvious and accessible data terminal is in [[Tech Storage]], but many more can be found around the station, and they are under all of the existing ThinkDOS computers. The mechanics can make more, but must be able to [[Guide to Wiring|properly wire]] them to the network.
This is the physical link to the wired network. A computer must be built on top of it to access that network. The most obvious and accessible data terminal is in [[Tech Storage]], but many more can be found around the station, and they are under all of the existing ThinkDOS computers. The mechanics can make more, but must be able to [[Guide to Wiring|properly wire]] them to the network.


====Packet Sniffer====
====Packet Sniffer====
[[File:PacketSniffer.png|frame|right]]
[[File:PacketSniffer.png|32px]]
 
Found in [[Tech Storage]]. Capable of detecting all packets sent on the wired network it is attached to. Looks and functions like a powersink-- just screw it onto a data terminal and it will begin scanning. There is not much data on the main network of the station besides that which comes from the communications dish, but other interesting data may be found by setting up the sniffer on the [[Engineer]] or Research networks.
Found in [[Tech Storage]]. Capable of detecting all packets sent on the wired network it is attached to. Looks and functions like a powersink-- just screw it onto a data terminal and it will begin scanning. There is not much data on the main network of the station besides that which comes from the communications dish, but other interesting data may be found by setting up the sniffer on the [[Engineer]] or Research networks.
'''Important note for packet sniffers''': The packet sniffer spaces out the various fields in a packet. If you want to copy them for your own use in, say, some Mechanics deathtrap, ''remove the spaces after the semicolons''.
====Powernet-networking Component====
[[File:Powernet-networkingComponentV2.png|32px]]
Found in the [[Engineering_Objects#MechComp_Dispenser|MechComp Dispenser]], the [[MechComp#Powernet|PowerNet Component]] when connected to a wired network via a data terminal lets you send messages to the wired network and receive messages to your mechanic components. It allows you to do things like controlling a DWAINE Terminal using a button.


====Network Diagnostics Cart====
====Network Diagnostics Cart====
[[File:NetworkDiagnosticsPDACartridge.png|frame|left]]
[[File:NetworkDiagnosticsPDACartridge.png|32px]]
 
This cart can accomplish many of the same tasks as the network tools disk, but from your [[PDA]]. It features a ping tool, a packet sniffing tool, a packet sender, and a packet crafting tool. The range on the packet sniffer can be adjusted from close to far. The packet crafting tool does not have the 26 character string limit that SigPal does, allowing more complicated messaging.
This cart can accomplish many of the same tasks as the network tools disk, but from your [[PDA]]. It features a ping tool, a packet sniffing tool, a packet sender, and a packet crafting tool. The range on the packet sniffer can be adjusted from close to far. The packet crafting tool does not have the 26 character string limit that SigPal does, allowing more complicated messaging.
==Packet Formatting==
==Packet Formatting==
A typical signal might look like this:
A typical signal might look like this:
Line 74: Line 89:
=== Creating packets ===
=== Creating packets ===


Packets can be created by using the following command:
Packets can be created in TermOS by using the following command:
:<code>echo field=value|nfield2=value2|nfield3=value3</code>
:<code>echo field=value|nfield2=value2|nfield3=value3</code>


Line 128: Line 143:


The first three are stored on the Authentication Disk, so if you ask nicely maybe the Captain will give it to you.
The first three are stored on the Authentication Disk, so if you ask nicely maybe the Captain will give it to you.
* <code>netpass_heads</code>: Used for Guardbuddy management, shuttle (re)calling, etc.
* <code>netpass_heads</code>: Used for Guardbuddy management, shuttle (re)calling, [[#Armory Authorization (146.1)|Armory Authorization]], etc.
* <code>netpass_security</code>: Used for the [[#Armory Authorization (146.1)|Armory Authorization]] and hacking into lockers. You can also find it on the [[Medical Objects#Data Disk|clone data disks]] every [[Security Officer]] and [[Head of Security]] starts with.  
* <code>netpass_security</code>: Used for hacking into lockers. You can also find it by looking through the [[Medical Objects#Data Disk|clone data disks]] every [[Security Officer]] and [[Head of Security]] starts with or listening in on [[#Armory Authorization (146.1)|Armory Authorization]] authorization or deauthorization signals.  
* <code>netpass_medical</code>: Unused.  
* <code>netpass_medical</code>: Unused.  
* <code>netpass_syndicate</code>: Exclusively for the Detomatix cart.
* <code>netpass_syndicate</code>: Exclusively for the Detomatix cart.
=== Connecting a device to the network ===
Devices are usually connected to the mainframe, and when disconnected, keep its last address in their memory. This is not the case with devices constructed from blueprints and a soldering iron like the science telepad.
In such cases where there is no previous connected address, '''you are required to manually connect it to the mainframe'''.
This requires a button and a powernet component.
# Connect the powernet component to a wired network using a data terminal.
# Connect the button to the powernet component.
# Set the terminal command message as the button value and send it.
The terminal connect message looks like this:
* <code>command=term_connect</code>
* <code>address_1=mainframe_address</code>
* <code>sender=device_address</code>
Example: <code>command=term_connect;address_1=02043924;sender=02054d8a</code>
The packet above will connect the sender device <code>02054d8a</code> to the address <code>02043924</code>. The sender device will save it as its reconnect address.
Finding the mainframe address can be done by using <code>term_ping mainframe</code> on a disconnected DWAINE terminal.
=== Controlling a terminal with MechComp ===
This lets you use MechComp to send a command to the mainframe as if you were the computer that is connected to the mainframe.
This requires:
* A powernet component.
* A DWAINE Terminal that is already logged into the mainframe
* An input device ( button, signal builder component, etc )
The terminal command message looks like this:
* <code>command=term_message</code>
* <code>address_1=mainframe_address</code>
* <code>sender=dwaine_terminal_address</code>
* <code>data=</code>command that will be sent to the terminal
Example: <code>command=term_message;address_1=02043924;sender=02054d8a;data=echo Hello World!</code>
The packet above will send a message from the DWAINE terminal <code>02054d8a</code> to the mainframe <code>02043924</code>. The message <code>echo Hello World</code> will be executed and return <code>Hello World!</code>.
Using <code>data=ls</code> would execute the command <code>ls</code> instead.
Player made scripts can also be executed as long as they are in the current directory of the connected DWAINE Terminal. <code>data=myscript 1 2 3</code> would execute the script called <code>myscript</code> with the arguments provided as if you were the one calling it directly from the console.


== Wired Network ==
== Wired Network ==
Stuff on the station network connected by red power cables. Get a list of these by running <code>term_ping</code> on any [[TermOS]] computer that isn't currently connected to something. Not all devices can be connected to via TermOS, though, and some won't reply to pings either. Sneaky!
Stuff on the station network connected by red power cables. Get a list of these by running <code>term_ping</code> on any [[TermOS]] computer that isn't currently connected to something. Not all devices can be connected to via TermOS, though, and some won't reply to pings either. Sneaky!  


'''Important note for packet sniffers''': The packet sniffer spaces out the various fields in a packet. If you want to copy them for your own use in, say, some Mechanics deathtrap, ''remove the spaces after the semicolons''.
'''Important: You can add an argument after running <code>term_ping</code> which will filter out any responses that do not contain the string. This is much easier than searching through every single device that replies to the ping.'''  


=== Mainframe (PNET_MAINFRAME) ===
=== Mainframe (PNET_MAINFRAME) ===
Line 157: Line 214:
** '''<code>reason</code>''': optional reason for calling the shuttle
** '''<code>reason</code>''': optional reason for calling the shuttle


* Transmit something to [[Admin|Centcom]]. Returns '''<code>status</code>''' = <code>TRANSMIT_E_SUCCESS</code> or <code>TRANSMIT_E_COOLDOWN</code>.
* Transmit something to [[Admin|Centcom]] or the partner station. Returns '''<code>status</code>''' = <code>TRANSMIT_E_SUCCESS</code> or <code>TRANSMIT_E_COOLDOWN</code>.
** '''<code>command</code>''': <code>transmit</code>
** '''<code>command</code>''': <code>transmit</code>
** '''<code>transmit_type</code>''': <code>centcom</code> for messages to centcom or <code>station</code> for messages to the partner station.
** '''<code>acc_code</code>''': The [[#Authentication|netpass_heads authentication code]]
** '''<code>acc_code</code>''': The [[#Authentication|netpass_heads authentication code]]
** '''<code>title</code>''': transmission title
** '''<code>title</code>''': transmission title
Line 203: Line 261:
Printers. Generally you just write to the <code>/mnt/lp-whatever</code> folders on the mainframe.
Printers. Generally you just write to the <code>/mnt/lp-whatever</code> folders on the mainframe.


{{Wip|Discover if there is a way to directly print to printers}}
{{Wip|Reason=Discover if there is a way to directly print to printers}}


=== Databanks (PNET_DATA_BANK) ===
=== Databanks (PNET_DATA_BANK) ===
Line 235: Line 293:
** You'll get a reply with <code>status=badtask</code> if the task is bad (or missing).
** You'll get a reply with <code>status=badtask</code> if the task is bad (or missing).


* <code>download</code>: Downloads a task from the buddy. Use <code>model=?</code> to download the default task, otherwise it'll download the current one.
* <code>download</code>: Downloads a task from the buddy. Use <code>model=1</code> to download the default task (the exact number doesnt matter), otherwise it'll download the current one.
** Replies with <code>command=taskfile</code> if it worked. In theory you'll get a file sent to your terminal with the task. What can you do with it?
** Replies with <code>command=taskfile</code> if it worked. In theory you'll get a file sent to your terminal with the task. What can you do with it?
** Replies with <code>command=status&status=notask</code> if there's no task to download.
** Replies with <code>command=status&status=notask</code> if there's no task to download.
Line 273: Line 331:
IR detectors, usually placed around important things like the Armory and sometimes the AI core.
IR detectors, usually placed around important things like the Armory and sometimes the AI core.


{{Wip|Update info on IR detectors}}
{{Wip|Reason=Update info on IR detectors}}


=== Artlab test apparatus (PNET_TEST_APPT) ===
=== Artlab test apparatus (PNET_TEST_APPT) ===
Line 299: Line 357:


=== Nuclear charge (PNET_NUCCHARGE) ===
=== Nuclear charge (PNET_NUCCHARGE) ===
The nuclear charge. Authentication is easily spoofed by using the mainframe's built in nuke manager, <code>nukeman</code>. Just use the same packet you used to spoof superuser access when asked to login with an authorized ID, then repeat with two more login packets under two different names (the registered= field).
The nuclear charge. Authentication is easily spoofed by using the mainframe's built-in nuke manager, <code>nukeman</code>. Just use the same packet you used to spoof superuser access when asked to login with an authorized ID, then repeat with two more login packets with superuser, but with one (or both) of the other fields modified. Either the registered= field or the assignment= field.
 
Hemera VII's main tape doesn't include this, so you'll have to bring a tape of your own with it, "borrow" one of the replacement Master Tapes on the station or use Hemera VII's other tape, which DOES have nukeman.
 
If you're feeling like a little bit of DIY, you can also connect to the nuke directly and run commands that way. The following commands can be run without any authorization:
* <code>status</code>: Returns the nuke status (whether it's counting down or not) and the time left.
* <code>settime</code>: Sets the detonation time. The maximum time is 600 seconds, the minimum is 120.


Hemera VII's main tape doesn't include this, so you'll have to bring a tape of your own with it or "borrow" one of the replacement Master Tapes on the station.
These commands require the "auth" field of your packet to be set to the correct <code>netpass_heads</code>:
* <code>act</code>: Activates the nuclear charge, with an accompanying announcement.
* <code>deact</code>: Deactivates the nuclear charge, stopping the countdown. Past 10 seconds, you can no longer disarm the nuke- run!


<sub>You can also scan the nuclear charge with a Syndicate device analyzer and deploy one elsewhere, if that's more [[Traitor|your thing]].</sub>
<sub>You can also scan the nuclear charge with a Syndicate device analyzer and deploy one elsewhere, if that's more [[Traitor|your thing]].</sub>
Line 338: Line 404:
<code>sender</code> is added automatically to almost every packet-sending device, though apparently you can get away without one by manually crafting a signal and using a wireless computer's free mode (with greatly reduced range).
<code>sender</code> is added automatically to almost every packet-sending device, though apparently you can get away without one by manually crafting a signal and using a wireless computer's free mode (with greatly reduced range).


PDA Ping ranges. Sending may be similar (or unlimited size?). Measured by dropping a PDA and seeing how far away it would still respond.
=== Wireless Range ===
{{Wip|Reason=Confirm that pings still go through Z-levels}}.
 
These are the PDA Ping ranges. You can imagine it as how far you can drop a PDA dropping and have it still respond. Sending may be similar (or unlimited size?).  
* <code>min</code>: 16 tiles
* <code>min</code>: 16 tiles
* <code>med</code>: 32 tiles
* <code>med</code>: 32 tiles
* <code>max</code>: 64 tiles
* <code>max</code>: 64 tiles


Note that pings go ''through'' [[Z-level]]s! If you manage to pin down a signal but there doesn't seem to be anything there, it's probably in the debris field or in one of the [[Adventure Zone|adventure zones]]. Welp! <sup>(todo: is this still true?)</sup>
Note that pings go ''through'' [[Z-level]]s! If you manage to pin down a signal but there doesn't seem to be anything there, it's probably in the debris field or in one of the [[Adventure Zone|adventure zones]]. Welp!  


Broadcast ranges are ''only'' for broadcasting &mdash; anything can receive a packet if it's in the broadcast range of the source, even if its own broadcast range is far smaller. If your device has a broadcast range of 64 tiles, and your target device has a range of 16 tiles, the target device will receive your signal as long as you're anywhere within 64 tiles, but you won't receive the device's beyond those 16.
Broadcast ranges are ''only'' for broadcasting &mdash; anything can receive a packet if it's in the broadcast range of the source, even if its own broadcast range is far smaller. If your device has a broadcast range of 64 tiles, and your target device has a range of 16 tiles, the target device will receive your signal as long as you're anywhere within 64 tiles, but you won't receive the device's beyond those 16.


=== PDAs (114.9) ===
=== PDAs (114.9) ===
Line 352: Line 420:
* Device name: <code>NET_PDA_51XX</code>
* Device name: <code>NET_PDA_51XX</code>
* Broadcast range: &ge; 64 tiles (127 &times; 127)
* Broadcast range: &ge; 64 tiles (127 &times; 127)


Packets:
Packets:
Line 358: Line 425:
* Snoop on people trying to use PDAs to covertly message people! <s>Just be sure to get your ID switched to "NSA Operative" first</s> Clear the log regularly so it doesn't clog up with PDA pings.
* Snoop on people trying to use PDAs to covertly message people! <s>Just be sure to get your ID switched to "NSA Operative" first</s> Clear the log regularly so it doesn't clog up with PDA pings.
Packet spoofing:
Packet spoofing:
* <code>address_1</code>: Omit to broadcast to every PDA in range. Otherwise, set to a PDA's address to send only to that PDA.
* <code>address_1</code>: Omit both this and <code>group</code> to broadcast to every PDA in range. Otherwise, set to a PDA's address to send only to that PDA.
* <code>group</code>: An alternative to <code>address_1</code>, sending to all PDAs in the specified group. See the 'Groups' section of your PDA's messenger app for some examples.
* <code>command</code>: Generally <code>text_message</code>, though there are others, including but not limited to:
* <code>command</code>: Generally <code>text_message</code>, though there are others, including but not limited to:
**<code>file_send_req</code> Used to send file send requests, though you can't actually send anything without using the PDA clipboard.
**<code>file_send_req</code> Used to send file send requests, though you can't actually send anything without using the PDA clipboard.
Line 374: Line 442:
Experiment! Maybe you'll find more.
Experiment! Maybe you'll find more.


=== Ruckingenur kits (114.9) ===
=== Ruckingenur kits (146.7) ===
Ruckingenur kits, like the one in the [[Electronics|Electronics lab]].
Ruckingenur kits, like the one in the [[Electronics|Electronics lab]].


Line 380: Line 448:
* Broadcast range: &ge; 64 tiles (127 &times; 127)
* Broadcast range: &ge; 64 tiles (127 &times; 127)


Ruckingenur kits use packets to maintain a distributed database of blueprints and whether or not they're locked.
The seven commands documented below are used by the ruck to maintain this database.


Packet sent when adding something to the database via PDA scan:
* <code>command</code>: <code>add</code> -- Adds something to the database. Doesn't actually specify what it is. D'oh.
* <code>address_1</code>: <code>02xxxxxx</code> -- Address of the kit, as usual
* A file, which you can't sniff, I guess.


After that, the kit will send out a PDA text message to the scanning PDA that it was either added or already in the database.
{| class="wikitable"
!colspan="2"|Ruckingenur Protocol
|-
|<code>command=SYNCREPLY</code>
|Sent after SYNC, every kit selects the highest net_id is assigned to be the host<br/>This command only accepts packets addressed to <code>TRANSRKIT</code>
|-
|<code>command=SYNC</code>
|Every ruck responds with <code>SYNCREPLY</code> and considers the sender as a potential host. The current host is an exception, if it detects a new ruck kit it will instead attempt to <code>UPLOAD</code> a Ruckingenur Bundle file containing the database of blueprints.<br/>This command only accepts packets addressed to <code>TRANSRKIT</code>
|-
|<code>command=DROP</code>
|Identical to SYNC except the sender of this packet is not considered as a host. Used when ruckingenur is shutting down.
|-
|<code>command=UPLOAD</code>
|Internal upload channel for blueprint distribution. A bincludes blueprint file. This channel does not generate PDA messages and is used to by rucks to transfer blueprints between themselves.
|-
|<code>command=add</code>
|PDA blueprint upload channel, identical to <code>UPLOAD</code> used by PDA device scanners. For <code>add</code> The host ruckingenur will send a PDA message to the mechanic groups to announce the upload. For legacy reasons the command is "add" not "ADD".
|-
|<code>command=DOWNLOAD</code><br/><code>data=Item Name</code>
|Internal blueprint file request channel, replies with UPLOAD packet with an attached file.
|-
|<code>LOCK=1</code><br/><code>acc_code=netpass_head</code><br/><code>DATA=Item Name</code>
|Used to lock and unlock blueprints by name, this packet is normally protected with NT class encryption and cannot be sniffed.<br/>This command only accepts packets addressed to <code>TRANSRKIT</code>
|}


Spoofing the packet does nothing, as it requires the file that you can't send. Scanning a device using a Device Analyzer sends no packets at scan or on addition to the kit.
Several of these commands distribute blueprint files, these can be sniffed and copied with mechcomp file components or other means.


When a device scanner is used, blueprints are distributed to other kits with an <code>UPLOAD</code> command. The ruckingenur kit that scanned the blueprints then sends a PDA message announcing the scans.


=== Wireless network adapters (114.9, variable) ===
=== Wireless network adapters (114.9, variable) ===
Line 396: Line 486:
* Device name: <code>WNET_ADAPTER</code>
* Device name: <code>WNET_ADAPTER</code>
* Broadcast range: varies
* Broadcast range: varies


Cogmap1's Morgue filing cabinet, for example:
Cogmap1's Morgue filing cabinet, for example:
Line 411: Line 500:
The following is sent exclusively by the docking stations. They also communicate over the wired network; see their section above for more.
The following is sent exclusively by the docking stations. They also communicate over the wired network; see their section above for more.
* <code>command=recharge_src; data=x=##&y=##;</code>: Sent by the docking station as a reply to the <code>recharge</code> broadcast, with its current X and Y (GPS) position, so the buddies know where to go to charge.
* <code>command=recharge_src; data=x=##&y=##;</code>: Sent by the docking station as a reply to the <code>recharge</code> broadcast, with its current X and Y (GPS) position, so the buddies know where to go to charge.


There's a lot of network traffic, but here's some examples. If you aren't targeting a specific bot's address, you need to include <code>acc_code=(netpass_heads)</code>.
There's a lot of network traffic, but here's some examples. If you aren't targeting a specific bot's address, you need to include <code>acc_code=(netpass_heads)</code>.
Line 418: Line 506:
* <code>command=captain_greet</code>: Makes the buddy say one of several goofy lines, if it's wearing the captain's hat. Sent by the tour guide buddy if it runs into another buddy wearing it.
* <code>command=captain_greet</code>: Makes the buddy say one of several goofy lines, if it's wearing the captain's hat. Sent by the tour guide buddy if it runs into another buddy wearing it.
* <code>command=wizard_greet</code>: Makes the buddy say of several other goofy lines, if it's wearing a wizard's hat. Sent by the tour guide buddy if it runs into another buddy wearing it.
* <code>command=wizard_greet</code>: Makes the buddy say of several other goofy lines, if it's wearing a wizard's hat. Sent by the tour guide buddy if it runs into another buddy wearing it.


=== Doors (141.1) ===
=== Doors (141.1) ===
Line 426: Line 512:
* Broadcast range: 6 tiles (11 &times; 11)
* Broadcast range: 6 tiles (11 &times; 11)


Sending a command to a door requires an access code, a number usually between 1 and 32 (inclusive). This can be found on the maintenance panel by screwdrivering the door. Doors only broadcast signals relatively close by, so you'll have to be nearby if you want to see anything. You can get the address of a door by screwdrivering it open and checking, using the packet sniffer and touching the door, or just taking a guess from doors that respond to your pings.


Sending a command to a door requires an access code, a number usually between 1 and 32 (inclusive). This can be found on the maintenance panel by screwdrivering the door. Doors only broadcast signals relatively close by, so you'll have to be nearby if you want to see anything. You can get the address of a door by screwdrivering it open and checking, using the packet sniffer and touching the door, or just taking a guess from doors that respond to your pings.
Some doors can't be screwdrivered so you'll have to use a different option, but those doors also tend to resist packet hacking. AI control is a requirement for doors to receive packets, and most of these doors have it off by default.
Some doors can't be screwdrivered so you'll have to use a different option, but those doors also tend to resist packet hacking. AI control is a requirement for doors to receive packets, and most of these doors have it off by default.


Line 438: Line 524:
** <code>lock_status</code>: State of the door bolts (e.g. <code>locked</code>, <code>unlocked</code>)
** <code>lock_status</code>: State of the door bolts (e.g. <code>locked</code>, <code>unlocked</code>)
** <code>tag</code>: This appears to always be blank.
** <code>tag</code>: This appears to always be blank.


Sending packets manually to open/close doors:
Sending packets manually to open/close doors:
Line 448: Line 533:
** <code>lock</code>: Drops the door bolts
** <code>lock</code>: Drops the door bolts
** <code>unlock</code>: Raises the door bolts
** <code>unlock</code>: Raises the door bolts
** <code>secure_open</code>: Bolts a door open*
** <code>secure_open</code>: Bolts a door open
** <code>secure_close</code>: Bolts a door closed*
** <code>secure_close</code>: Bolts a door closed


<small>*Used by the [[Syndicate Items#EMAG|cryptographic sequencer]].</small>
=== Network Radio (141.1, 141.9, also varies) ===
{{Wip|Reason=Determine broadcast range, find if it possible to receive other files and save them to the disk with <code>file_save [name]</code>
}}


=== Network Radio (141.1, 141.9, also varies) ===
The "Network Radio", which looks like... well, an old timey radio. Usually located near the mainframe in the computer core, sometimes it's elsewhere. This is what interfaces with the mainframe's <code>/mnt/radio</code>.
The "Network Radio", which looks like... well, an old timey radio. Usually located near the mainframe in the computer core, sometimes it's elsewhere. This is what interfaces with the mainframe's <code>/mnt/radio</code>.
* Device name: <code>PNET_PR6_RADIO</code>
* Device name: <code>PNET_PR6_RADIO</code>
Line 459: Line 545:


You can log into the mainframe by connecting to this using a computer with a wireless network peripheral and FROG or TermOS. You can create a login packet using ThinkDOS's WizWrite and put it on the main drive in ThinkDOS under whatever name you want, then restart with a TermOS disk and run "<code>file_load [name]</code>" in TermOS, which will allow you to run <code>file_send</code> with the login packet.
You can log into the mainframe by connecting to this using a computer with a wireless network peripheral and FROG or TermOS. You can create a login packet using ThinkDOS's WizWrite and put it on the main drive in ThinkDOS under whatever name you want, then restart with a TermOS disk and run "<code>file_load [name]</code>" in TermOS, which will allow you to run <code>file_send</code> with the login packet.
Alternatively, maybe you can receive other files and save them to the disk with <code>file_save [name]</code>, too...?


=== Secure Lockers (143.1) ===
=== Secure Lockers (143.1) ===
Line 471: Line 554:


You can send these a few commands over the radio, though you'll need <code>netpass_security</code> to lock or unlock them and <code>netpass_heads</code> to find <code>netpass_security</code>.
You can send these a few commands over the radio, though you'll need <code>netpass_security</code> to lock or unlock them and <code>netpass_heads</code> to find <code>netpass_security</code>.
* <code>address_1=(address)</code>: this is required to send packets to a locker and can be found by using a multitool on the locker itself.
* <code>command=status</code>: Replies with <code>command=lock=[locked]&open=[open]</code>
* <code>command=status</code>: Replies with <code>command=lock=[locked]&open=[open]</code>
* <code>command=lock; pass=(netpass_security)</code>: Locks the locker.
* <code>command=lock; pass=(netpass_security)</code>: Locks the locker.
Line 478: Line 562:


Personal lockers don't send messages when opened/claimed with an ID.
Personal lockers don't send messages when opened/claimed with an ID.


=== Hydroponics trays (143.3) ===
=== Hydroponics trays (143.3) ===
{{Wip|Reason=Determine if still current.}}


* Device name: One of <code>WNET_PACKETSPY</code>, <code>WNET_GENERIC</code>, <code>WNET_DETECTOR</code>, <code>WNET_SYN%%^#FF</code>, randomly
* Device name: One of <code>WNET_PACKETSPY</code>, <code>WNET_GENERIC</code>, <code>WNET_DETECTOR</code>, <code>WNET_SYN%%^#FF</code>, randomly
Line 492: Line 576:
** <code>event_cleared</code>: The plant (dead or otherwise) was removed from the tray.
** <code>event_cleared</code>: The plant (dead or otherwise) was removed from the tray.


Yep, that's it. There's nothing useful here <sub>(as of the 2016 release)</sub>. Not even the type of seed, or if it's ready to harvest, or anything. Sorry.
Yep, that's it. There's nothing useful here. Not even the type of seed, or if it's ready to harvest, or anything. Sorry.
 


=== Fire Alarms (143.7) ===


=== Fire Alarms (143.7) ===
* Device name: <code>WNET_FIREALARM</code>
This is from the 2016 release and may not be entirely relevant now, but...
* Device name: <code>PNET_FIREALARM</code> (even though it's WNET...)
* Broadcast range: &infin; (possibly)
* Broadcast range: &infin; (possibly)


Broadcasts a packet when things happen:
Broadcasts a packet when things happen:
* <code>zone</code>: Location name (like <code>Head of Research's Office</code>)
* <code>address_tag</code>: Location name (like <code>Head of Research's Office</code>)
* <code>type</code>: Alarm type (always <code>Fire</code>)
* <code>type</code>: Alarm type (always <code>Fire</code>)
* <code>netid</code>: Network address (as well as <code>sender</code> for some reason)
* <code>netid</code>: Network address (as well as <code>sender</code> for some reason)
Line 509: Line 590:
** <code>fire</code>: Fire alarm triggered
** <code>fire</code>: Fire alarm triggered
** <code>reset</code>: Fire alarm cleared
** <code>reset</code>: Fire alarm cleared


You can also trigger these remotely if you want to be annoying.
You can also trigger these remotely if you want to be annoying.
* <code>address_1</code>: Network address of the Fire Alarm. (Required.)
* <code>command=#####</code>: One of the following:
* <code>command=#####</code>: One of the following:
** <code>status</code>: Triggers the above packet broadcast.
** <code>status</code>: Triggers the above packet broadcast.
Line 517: Line 598:
** <code>reset</code>: Resets the alarm.
** <code>reset</code>: Resets the alarm.


=== Robot patrol beacons (many frequencies) ===
{{Wip|Reason=Add ways for triggering, receiving, and editing beacon broadcasts, as well as more info on how they work. Find real example of patrol beacon pack}}


=== Robot patrol beacons (many frequencies) ===
Various patrol beacons around the station. These are used by Guardbuddies, Securitrons, and the tour guide, though often not on the same frequencies.
Various patrol beacons around the station. These are used by Guardbuddies, Securitrons, and the tour guide, though often not on the same frequencies.
* Frequencies: 143.1, 144.1, 144.3, 144.5, and so on.
* Frequencies: 143.1, 144.1, 144.3, 144.5, and so on.
Line 525: Line 607:


Securitron and tour guide beacons broadcast on this frequency. They're located under floor tiles, and you can access them by popping them open with a screwdriver and swiping an appropriate card.
Securitron and tour guide beacons broadcast on this frequency. They're located under floor tiles, and you can access them by popping them open with a screwdriver and swiping an appropriate card.
Todo: This section needs some updating, for triggering and receiving beacon broadcasts, as well as editing them and how they work.


'''Tour Guide beacon''', this one from the Escape Arm:
'''Tour Guide beacon''', this one from the Escape Arm:
Line 534: Line 614:
** <code>desc</code>: <code>In the event of catastrophic station damage...</code> (What the tour guide will say when stopping here)
** <code>desc</code>: <code>In the event of catastrophic station damage...</code> (What the tour guide will say when stopping here)


'''Patrol beacon''', a fictional example (TODO: get a real one):
'''Patrol beacon''', a fictional example:
* Location: <code>sec</code>
* Location: <code>sec</code>
** <code>patrol</code>: <code>1</code> -- Marks it as a patrol beacon
** <code>patrol</code>: <code>1</code> -- Marks it as a patrol beacon
** <code>next_patrol</code>: <code>bar</code> -- Which beacon comes after this in the route (TODO: verify the name)
** <code>next_patrol</code>: <code>bar</code> -- Which beacon comes after this in the route  


You can't move the beacons around or create new ones, but you can at least make Murray shout obscenities when describing places. Or make him get stuck into a loop forever. Keep in mind that the text length you're allowed to enter is much shorter than the length of the default tour messages.
You can't move the beacons around or create new ones, but you can at least make Murray shout obscenities when describing places. Or make him get stuck into a loop forever. Keep in mind that the text length you're allowed to enter is much shorter than the length of the default tour messages.
Line 547: Line 627:
</pre>
</pre>


 
==== Securitrons (144.7) ====
=== Securitrons (144.7) ===
[[Robots#Securitron|Securitrons]].
[[Robots#Securitron|Securitrons]].


Line 563: Line 642:
** <code>5</code>: ''On patrol''
** <code>5</code>: ''On patrol''
** <code>6</code>: (''Responding to summons'') &mdash; will go to mode 4 and start patrolling when it reaches its destination
** <code>6</code>: (''Responding to summons'') &mdash; will go to mode 4 and start patrolling when it reaches its destination


'''Controlling via the [[PDA#R.O.B.U.S.T.|R.O.B.U.S.T. cart's Securitron app]]:'''
'''Controlling via the [[PDA#R.O.B.U.S.T.|R.O.B.U.S.T. cart's Securitron app]]:'''
Line 574: Line 652:
* <code>target</code>: <code>the floor</code>; only if <code>command=summon</code>. (see note below)
* <code>target</code>: <code>the floor</code>; only if <code>command=summon</code>. (see note below)


Notes: These are BYOND internal atom references, and not actually text, so they're impossible to replicate in packets. These only work from the PDA application for that reason.
Notes: These are BYOND internal atom references, and not actually text. What's happening is that a BYOND atom reference is being passed in the packet, and printing this reference will yield its name ("(the) floor"). As a result, they're impossible to replicate in packets. These only work from the PDA application for that reason.


<small>(Original note: This is because a byond atom reference is being passed in the packet, printing this reference will yield its name ("(the) floor"). ''It is impossible to replicate this packet.'' I'd recommend bringing this to IBM's attention. --[[User:Marquesas|Marquesas]])</small>
==== MULE bots (144.7) ====
 
 
=== MULE bots (144.7) ===
[[Robots#MULEBot|MULE bots]].
[[Robots#MULEBot|MULE bots]].


'''Status updates, sent from the bots:'''
'''Status updates, sent from the bots:'''
* <code>type</code>: <code>mulebot</code>
* <code>type</code>: <code>mulebot</code>
* <code>name</code>: <code>1</code> -- Likely the name in the [[Quartermaster|Quartermaster's]] [[PDA#Space Parts & Space Vendors Cartridge|PDA MULE control app]], likely unique to each bot
* <code>name</code>: <code>1</code> -- The bot's unique name/ID number.
* <code>loca</code>: <code>Supply Lobby</code> -- whatever the location of the bot is
* <code>loca</code>: <code>Supply Lobby</code> -- The bot's current location.
* <code>mode</code>: <code>0</code> -- One of the various modes:
* <code>mode</code>: <code>0</code> -- The bot's current mode, from the following:
** (TODO, no research on this yet)
** <code>0</code>: Ready
* <code>powr</code>: <code>100</code> -- Current cell charge
** <code>1</code>: Loading/Unloading
* <code>dest</code>: ''unknown'' -- TODO. Destination, format is unknown. Probably the name of the location
** <code>2</code>: Navigating to Delivery Location
* <code>home</code>: <code>QM #1</code> -- Bot's home location (TODO: Underfloor beacon?)
** <code>3</code>: Navigating to Home
* <code>load</code>: <code>Jon Pubbie</code> -- Whatever is currently loaded on top of the bot, e.g. player name, <code>Crate</code>, etc
** <code>4</code>: Waiting for clear path
* <code>retn</code>: <code>1</code> -- Return home after delivery
** <code>5</code>: Calculating navigation path
* <code>pick</code>: <code>1</code> -- Pick up crates at the destination
** <code>6</code>: Calculating navigation path
** <code>7</code>: Unable to locate destination
* <code>powr</code>: <code>100</code> -- The bot's current cell charge.
* <code>dest</code>: <code>Medbay</code> -- The bot's current target destination. Refers to an underfloor MULE Delivery Beacon.
* <code>home</code>: <code>QM #1</code> -- The bot's home location. Refers to an underfloor MULE Delivery Beacon.
* <code>load</code>: <code>Jon Pubbie</code> -- Whatever is currently loaded on top of the bot, e.g. player name, Crate, etc.
* <code>retn</code>: <code>1</code> -- Will the bot automatically return home after the delivery?
* <code>pick</code>: <code>1</code> -- Will the bot automatically pick up any cargo at the delivery destination?


Controlling via the QM's PDA: (todo)
'''Controlling via the QM's PDA:'''
 
Likely has the same bug as Securitrons above, since they share a lot of the same code.


The # in <code>command_#</code> should be replaced with the name (number) of the bot being controlled (for example, <code>command_1</code> would control mulebot #1).
* <code>command_#</code>: Should be one of the following:
** <code>bot_status</code>: Get the bot's current status (as seen above).
** <code>target</code>: Set the bot's destination.
** <code>autoret</code>: Set whether the bot should return after a delivery.
** <code>autopick</code>: Set whether the bot should pickup crates at the destination.
** <code>stop</code>: Tell the bot to stop where it is.
** <code>go</code>: Tell the bot to continue towards its destination.
** <code>home</code>: Tell the bot to return to its home location.
* <code>destination</code>: The ID of the bot's new destination (see [[Quartermaster#The_MULE|the MULE bot section of the Quartermaster page]] for a list of valid destinations). Only used if <code>command_#</code> is set to <code>target</code>.
* <code>value</code>: Should be <code>1</code> or <code>0</code>, corresponding to Yes or No respectively. Only used if <code>command_#</code> is set to <code>autoret</code> or <code>autopick</code>.


=== Armory Authorization (146.1) ===
=== Armory Authorization (146.1) ===
This is the computer used by heads of staff to authorize the armory.
This is the [[Security Objects#Armory Authorization|computer]] used by Security to authorize the armory.
* Device name: <code>ARM_AUTH</code>
* Device name: <code>ARM_AUTH</code>
* Broadcast range: todo
* Broadcast range: 3 tiles (5 × 5)
 
Sending the following packet authorizes the armory:
<code>address_1=[arm_auth netid];command=authorize;acc_code=[netpass_heads];</code>
 
The armory will reply with a packet containing a different <code>acc_code</code> than what you sent it. This new code is <code>netpass_security</code>. This netpass is needed to open lockers via packets.
 
Beware, only the [[Head of Security]], [[Captain#Nuclear_Authentication_Disk|Authentication Disk]] (if not already used to authorize the armory) or a packet (shown below) can unauthorize the armory.
You can unauthorize the armory via sending the following packet once armory is authorized.
<code>address_1=[armory_auth netid];command=unauthorize;acc_code[netpass_heads];</code>
 
=== Remote Signaling Devices (Variable; 141.1 - 148.9) ===
[[Science Objects#Remote Signaler|Remote Signalers]] are used to transmit and receive simple packets containing a numerical code via a customizable frequency. They will only ever send and receive packets on the frequency they are tuned to.
* Broadcast range: ∞
<!--PRETTY SURE this is the case based on the code for signalers but I've yet to test this in-game-->
When the ACTIVATE button is pressed in a signaler's UI, the following packet is sent over the frequency the signaler is tuned to:
* <code>message:</code> <code>ACTIVATE</code>
* <code>code:</code> Whatever the code in the signaler's UI is set to
 
Signalers will respond to packets formatted in the above structure (the <code>message=ACTIVATE</code> is entirely unnecessary) on their frequency, activating whatever device they may be connected to if the value of <code>code</code> matches the code of the signaler itself.
 
Signalers do not adjust their behavior if <code>address_1</code> is present in the packet, and will never include a <code>sender</code> or <code>address_1</code> key in their packets.
 
=== Space GPS (145.3) ===
[[Science_Objects#Space_GPS|Space GPS's]] allow a user to see their coordinates and the coordinates of other GPS's, as well as tracking other GPS's. GPS's may be wirelessly requested to share their coordinates, which is done with the the use following packet structure:


The armory responds with <code>acc_code=netpass_security</code> when authorized, which is needed to open lockers via packets.
<code>command:</code> <code>status</code>
 
<code>address_1:</code> The address of the GPS you wish to see the status of
 
 
 
They will respond with the following packet:
 
<code>sender:</code> The GPS's address
 
<code>address_1:</code> The address of the device that sent the <code>status</code> command
 
<code>identifier:</code> Contains the identifier of the GPS (e.g: <code>7372-NT13</code>)
 
<code>coords:</code> Contains the X and Y coordinates of the GPS, in <code>x,y</code> format (e.g <code>coords=111,89</code>)
 
<code>location:</code> Contains the GPS's Landmark (such as Station or Debris Field). Does NOT contain raw Z level coordinate.
 
<code>distress:</code> 1 if the Distress Signal is active, 0 otherwise
 
 
Example packet: <code>sender=0202dd33; address_1=0202db82; identifier=7372-BRYC; coords=111,89; location=Landmark: Ship; distress=0</code>
 
 
 
GPS also sends similar packet when the distress alert is activated/deactivated, but the distress field is replaced with distress_alert:
 
<code>distress_alert:</code> help when activated, clear otherwise
 
 
Example packet: <code>sender=02049fe0; identifier=5324-test; coords=196,140; location=Landmark: Station; distress_alert=help;</code>
 
 
Notably, the GPS identifier is also present in the message a GPS replies to a standard ping with, rather than just its device ID.
 
 
=== Air Vents (141.9) ===
The common air vent you see on station. Can both siphon and release air.
* Device name: <code>AVP</code>
* Broadcast range: ∞
 
Flashes green when receiving a signal that can cause a change in state. Its light is blue when releasing and red when siphoning.
* <code>netid=(address)</code>: This is required to send packets to an air vent and can be found by using a multitool on the vent itself.
* <code>tag=(address)</code>: A tag that refers to a group of atmospheric devices. Can be used to send packets to an atmospheric device in place of netid. Unlikely to exist on air vents however.
{| class="wikitable"
|+ Available Commands
|-
! command= !! parameter= !! Explanation
|-
| power_on || No parameters || Turns the air vent on.
|-
| power_off || No parameters || Turns the air vent off.
|-
| power_toggle || No parameters || Toggles the air vent.
|-
| set_direction || (Number) siphoning (parameter<=0.5); releasing (parameter>0.5) || Determines whether the air vent will siphon air from the turf or release air into the turf.
|-
| set_checks || (Bitflag) External bound (1), Internal bound (2), both (3) || Sets a check on whether the air vent should not pass the external (the turf's air) pressure bound, internal (the vent's air) pressure bound, or both. When releasing, external bound is the maximum that the turf pressure can be and internal bound is the minimum that our pressure can be until we stop pumping. When siphoning, external bound is the minimum that the turf pressure can be and internal bound is the maximum that our pressure can be until we stop pumping.
|-
| purge || No parameters || Switches to siphoning mode and removes the external bounds check.
|-
| end_purge || No parameters || Switches to siphoning mode and adds the external bounds check.
|-
| stabilise || No parameters || Switches to releasing mode and adds the external bounds check.
|-
| set_internal_pressure || (Number) pressure bound. Max at 5066.25 || Sets the internal pressure bound to a pressure in kilopascals.
|-
| set_external_pressure || (Number) pressure bound. Max at 5066.25 || Sets the external pressure bound to a pressure in kilopascals.
|-
| broadcast_status || No parameters || Sends out a packet containing its current status and other values about itself.
|-
| help || No parameters || Sends out a packet containing a more short version of the commands.
|}
 
 
=== Injectors (141.9) ===
The injectors you usually see in combustion chambers. Only releases air.
* Device name: <code>AO</code>
* Broadcast range: ∞
 
Flashes the little light cyan when receiving a signal that can cause a change in state.
* <code>netid=(address)</code>: This is required to send packets to an injector and can be found by using a multitool on the injector itself.
* <code>tag=(address)</code>: A tag that refers to a group of atmospheric devices. Can be used to send packets to an atmospheric device in place of netid. Unlikely to exist on injectors however.
{| class="wikitable"
|+ Available Commands
|-
! command= !! parameter= !! Explanation
|-
| power_on || No parameters || Turns the injector on.
|-
| power_off || No parameters || Turns the injector off.
|-
| power_toggle || No parameters || Toggles the injector.
|-
| inject || No parameters || Injects gas into the turf. Flashes the little light also.
|-
| set_volume_rate || (Number) Liters of gas. Max is 200 liters. || Sets how many liters of gas to inject into the turf.
|-
| broadcast_status || No parameters || Sends out a packet containing its current status and other values about itself.
|-
| help || No parameters || Sends out a packet containing a more short version of the commands.
|}
 
 
=== Gas pump (122.5) ===
Pumps pump air around in pipes. Seems pretty simple.
* Device name: <code>AGP</code>
* Broadcast range: ∞
 
Flashes cyan when receiving a signal that can cause a change in state.
* <code>netid=(address)</code>: This is required to send packets to a pump and can be found by using a multitool on the pump itself.
* <code>tag=(address)</code>: A tag that refers to a group of atmospheric devices. Can be used to send packets to an atmospheric device in place of netid.
{| class="wikitable"
|+ Available Commands
|-
! command= !! parameter= !! Explanation
|-
| power_on || No parameters || Turns the gas pump on.
|-
| power_off || No parameters || Turns the gas pump off.
|-
| power_toggle || No parameters || Toggles the gas pump.
|-
| set_output_pressure || (Number) release pressure. Max is 15097.425 kPa. || Sets the target pressure of the gas pump.
|-
| broadcast_status || No parameters || Sends out a packet containing its current status and other values about itself.
|-
| help || No parameters || Sends out a packet containing a more short version of the commands.
|}
 
 
=== Marionette implants (115.3) ===
A traitor item that lets you puppet people around in limited ways. See [[Syndicate_Items#Marionette_Implant|Syndicate Items]] for more info.
* Device name: <code>IMP_MARIONETTE</code>
* Broadcast range: ∞
 
To activate a marionette implant remotely, you'll need to provide its ''passkey'' with <code>passkey=######</code>. This is unique for every implant, and you can find it out by examining the implanter it comes in. Just in case you forget to do that, you'll also get a reminder message in your chatlog whenever you implant someone.
 
Possible commands are as follows, passed with <code>command=#######</code>:
* <code>ping</code>: Gets the status of this implant as a reply.
** <code>status=DANGER</code>: This implant is above the safe heat cap (100). Using it may cause it to burn out.
** <code>status=ACTIVE</code>: The implant is inside a mob and ready for use.
** <code>status=IDLE</code>: The implant is not inside of a mob.
** Unlike every other command, pinging an implant doesn't require its passkey.
 
* <code>unlink</code>: If this implant is linked to a remote, removes its connection to that remote.
** The packet's origin has to be a linked remote for it to work. In other words, you can't craft this packet yourself; it's documented here only for clarity on packet sniffers and the like.
 
* <code>say</code>, <code>speak</code>: Forces the implantee to speak a provided phrase aloud. +15 heat.
** Reads from the <code>data</code> field; <code>data=Hello</code> would force the mob to say "Hello", for instance.
** Max 45 characters, and it trims asterisks so you can't force them to emote (but you <i>can</i> make them speak over radio). +15 heat.
 
* <code>emote</code>: Forces the implantee to emote something. +15 heat.
** Reads from the <code>data</code> field; <code>data=flip</code> would force the mob to flip, for instance.
** A number of disruptive emotes, such as *faint, *deathgasp, and *trip, are blacklisted from this function.
 
* <code>move</code>, <code>step</code>, or <code>bump</code>: Forces the implantee to move in a cardinal direction. +5 heat.
** Reads from the <code>data</code> field; you can use the full direction (i.e. <code>NORTH</code>) or just an abbreviation (i.e. <code>N</code>). Not case-sensitive.
** Unlike other functions, this works on dead mobs as long as they're still [[Decomposition|fresh]]. Make of that what you will.
 
* <code>shock</code> or <code>zap</code>: Inflicts a moderate chunk of stamina loss and disorient. +50 heat.
** [[Guide_to_Genetics#SMES_Human|SMES Human]] doesn't prevent this, since it functions by stimulating the nervous system and not with an an undirected, external electrical shock.
 
* <code>drop</code> or <code>release</code>: Forces the implantee to drop whatever they're holding. +60 heat.
** The heat cost for this function is inflicted even if it fails to do anything, so you can't spam it constantly.
 
* <code>use</code> or <code>activate</code>: Forces the implantee to activate whatever they're holding. +35 heat.
** Like the <code>drop</code> function, the heat cost for this function is inflicted even if the target isn't holding anything.


'''Getting netpass_security:'''
Sending the following packet authorizes the armory:


<code>address_1=[arm_auth netid];command=authorize;acc_code=[netpass_heads];</code>
After each activation, the implant sends a response signal (<code>command=activate</code>) to the source that triggered it, containing a report about how the activation went:
* <code>stack=TARG_NULL</code> means that the implant isn't inside of a mob.
* <code>stack=TARG_DEAD</code> means that implantee is dead!
* <code>stack=BADPASS</code> means that the provided passkey isn't correct.
* <code>stack=INVALID</code> can mean a number of things:
** The provided command doesn't exist. Check your spelling.
** The data is invalid, such as trying to use a blacklisted emote for <code>emote</code>.
** The conditions to activate that command weren't met, such as using <code>drop</code> while the target isn't holding any items.
* If <code>stack</code> isn't present at all in the return packet, the provided command was executed successfully!


The armory will reply with a packet containing a different <code>acc_code</code> than what you sent it. This new code is <code>netpass_security</code>.
If you're absolutely sure that you have the address and passkey right and it hasn't been removed from its mob, but nothing you send is receiving a reply, it likely means that the implant is burned out from overheating. When used with the remote, implants will send pings when they become dangerously hot and when they burn out; using them with packets, however, will <b>not</b> provide any information. You'll only know once it stops responding to your signals. Plan out your heat usage carefully!


There does not seem to be a way to unauthorize the armory, and there is currently no other method for getting <code>netpass_security</code>.
==Supplementary Video==
==Supplementary Video==
<youtube>vYNnPx8fZBs</youtube>
<youtube>vYNnPx8fZBs</youtube>
{{Department Guides}}

Latest revision as of 03:39, 7 July 2024

Welcome to the art of packets. Many of the machines you see in the game use radio signals, commonly called "packets" or more rarely just "signals", to perform certain functions. The art of intercepting and crafting your own signals for various purposes is called "packet-hacking". Packet hacking is a very powerful tool which can be used to escape or break into places, among other uses.

Rules

Hack responsibly!

Like mechanical hacking, packet-hacking is not in of itself a violation of the rules or a crime Security could persecute you for. It is not considered Grief in the same way, say, bombing something could be, and you do not need to be antagonist to use packets.

However, if you use packet-hacking to commit crime, e.g. using packets to break into the Research Sector, then crew are well within their right to try to stop you, and Security is allowed to punish you for it.

In addition, if you use packet-hacking to break into sensitive places (e.g. AI Upload, Security in general, Armory specifically), steal vital job equipment (e.g. the Captain's spare ID), or commit other borderline Grief acts, you can be yelled at by an Admin or even banned from the game for a while, especially if you make a habit of doing it.

Packet Tools

Software

SigCatcher

The best way to find signals to decipher is with the program SigCatcher, available on the Network Tools disk. SigCatcher will snag any packet that the computer can detect-- either wired packets sent directly to that computer, or wireless packets when the wireless card is in mode free. The program only has a buffer for one signal at a time though, so you may need to check it frequently. It can run as a program in the background while you mess with other things. SigCatcher has two modes:

  • on will display the last packet received.
  • auto will grab the first packet it receives, then stops monitoring traffic, ensuring the packet is not overwritten by subsequent network activity.
  • save will save the current signal as a file to your computer.
  • quit will get you out of the program, but keep it running in the background.
  • fquit will end the program entirely.

SigPal

Once you've started deciphering packets, you can begin to make your own using SigPal.

  • Add [Key] [Data] is the core to setting up your packets. You need to have the right keys for other machines to understand what you're sending them.
  • File lets you add a file to send.
  • Remove If you make a mistake, you can't simply overwrite a line, you need to delete it, then add it back.
  • New to clear the entire packet.
  • View to view your current packet in its entirety.
  • Save to save as a signal file.
  • Load to load a signal file.
  • Send to transmit the packet through the computer's network card.

FROG

Allows you to ping and connect to other terminals in a manner similar to DWAINE. Bear in mind that the Research Mainframe is very occasionally on a physically separate network from the rest of the station. FROG will not recognize a wireless card. You can use this allow a ThinkDOS computer to act like a TermOS terminal, i.e. it can connect to the mainframe.

Ping

Pings and records ping data. Also does not recognize a wireless card.

Hardware

Data Terminal

DataTerminalV2.png

This is the physical link to the wired network. A computer must be built on top of it to access that network. The most obvious and accessible data terminal is in Tech Storage, but many more can be found around the station, and they are under all of the existing ThinkDOS computers. The mechanics can make more, but must be able to properly wire them to the network.

Packet Sniffer

PacketSniffer.png

Found in Tech Storage. Capable of detecting all packets sent on the wired network it is attached to. Looks and functions like a powersink-- just screw it onto a data terminal and it will begin scanning. There is not much data on the main network of the station besides that which comes from the communications dish, but other interesting data may be found by setting up the sniffer on the Engineer or Research networks.

Important note for packet sniffers: The packet sniffer spaces out the various fields in a packet. If you want to copy them for your own use in, say, some Mechanics deathtrap, remove the spaces after the semicolons.

Powernet-networking Component

Powernet-networkingComponentV2.png

Found in the MechComp Dispenser, the PowerNet Component when connected to a wired network via a data terminal lets you send messages to the wired network and receive messages to your mechanic components. It allows you to do things like controlling a DWAINE Terminal using a button.

Network Diagnostics Cart

NetworkDiagnosticsPDACartridge.png

This cart can accomplish many of the same tasks as the network tools disk, but from your PDA. It features a ping tool, a packet sniffing tool, a packet sender, and a packet crafting tool. The range on the packet sniffer can be adjusted from close to far. The packet crafting tool does not have the 26 character string limit that SigPal does, allowing more complicated messaging.

Packet Formatting

A typical signal might look like this:

[command] [text_message]
[message] [What is your favorite pony]
[sender_name] [Weedgoku420]
[address_1] [02001921]
[sender] [02002276]

Each line of the signal consists of two items, the first item identifying the type of data, the second item identifying the actual data. This packet can be broken down as such:

[command] [text_message]
This tells the PDA that this command is a text message. This is just one of many commands available.

[message] [What is your favorite pony]
This is the text of the message. Note that a computer can handle a maximum of 26 characters.

[sender_name] [Weedgoku420]
This is what the sender's name will appear as in the message. No verification of this is done whatsoever, so the PDA will happily display whatever is written in the signal file. The limitation is again 26 characters.

[address_1] [02001841]
This is the network ID of the PDA the message will be going to.

[sender] [02002872]
This is the network ID of the PDA sending the message.

Creating packets

Packets can be created in TermOS by using the following command:

echo field=value|nfield2=value2|nfield3=value3

To store the packet as a file on the mainframe:

echo ... ^ /home/pjones/filename

To send a file (like a packet!) to your terminal, so you can send it with file_send or print it with file_print, save the file to the /mnt/term directory:

cp /home/pjones/filename /mnt/term/x

If you just need to get the file right away, you can simply save the file in /mnt/term right away:

echo ... ^ /mnt/term/foo

Any packet you send must have both a sender ID and an address. In mode net and on wired networks, the sender ID must correspond to your network module's number-- you can check that using the periph view command. Other data can be spoofed-- for instance, in sending a text message, you could change the sender name to whatever you want and make security think a Blob is somehow messaging them.

Any and all packets typed into a terminal are formatted as the following: code=output; - they must always be ended with a semi-colon. For example, command=open;address_1=1234

Sending packets using the mainframe's radio

You can use DWAINE to send out packets over the air. The mainframe's radio has a limited range, though, so it won't reach everything.

  1. Create a directory for the frequency you want to transmit on. Directories are the four numbers without the decimal point, e.g. /mnt/radio/1149 for 114.9, by using the command mkdir /mnt/radio/1149
    • If the directory already exists for whatever reason, you can skip this step.
  2. Craft your packet.
    • Optional: Save it if you need to use it more than once. Otherwise, just use echo and pipe it directly.
  3. Copy or move your crafted packet to the folder you created, e.g. copy packet /mnt/radio/1149 or echo ... ^ /mnt/radio/1149/packet

If it worked, the packet you crafted should automatically be sent out by the radio. You can use the Packet Sniffer program on your PDA to confirm.

Spoofing the login packet

Faking a login involves a few specific steps. You'll generally always need a valid ID of any kind to do the initial login, though.

  1. Log into the mainframe (insert your card and term_login)
  2. Craft a login packet
  3. Send the crafted packet back to your terminal
  4. Either enter su for admin rights, or disconnect and reconnect to log in as a completely different user
  5. Instead of using term_login, use file_send to send the packet you saved earlier
  6. You are now logged in with your forged user

The login packet looks like this:

  • registered=Pubbie Jones
  • assignment=Staff Assistant
  • access=, followed by a (semicolon? comma?)-separated list of rights — every access in the ID computer has a different one. The important one for su access is 34.

Applying all of the above to create the packet and register it for file_send:

echo registered=Pubbie Jones|nassignment=Staff Assistant|naccess=34 ^ /mnt/term/loginpacket

Keep in mind that you shouldn't use this to set the Guardbuddies to purge or other destructive things unless you're a traitor.

Authentication

There are a handful of authentication codes you may or may not need.

The first three are stored on the Authentication Disk, so if you ask nicely maybe the Captain will give it to you.

Connecting a device to the network

Devices are usually connected to the mainframe, and when disconnected, keep its last address in their memory. This is not the case with devices constructed from blueprints and a soldering iron like the science telepad.

In such cases where there is no previous connected address, you are required to manually connect it to the mainframe.

This requires a button and a powernet component.

  1. Connect the powernet component to a wired network using a data terminal.
  2. Connect the button to the powernet component.
  3. Set the terminal command message as the button value and send it.

The terminal connect message looks like this:

  • command=term_connect
  • address_1=mainframe_address
  • sender=device_address

Example: command=term_connect;address_1=02043924;sender=02054d8a The packet above will connect the sender device 02054d8a to the address 02043924. The sender device will save it as its reconnect address.

Finding the mainframe address can be done by using term_ping mainframe on a disconnected DWAINE terminal.

Controlling a terminal with MechComp

This lets you use MechComp to send a command to the mainframe as if you were the computer that is connected to the mainframe.

This requires:

  • A powernet component.
  • A DWAINE Terminal that is already logged into the mainframe
  • An input device ( button, signal builder component, etc )

The terminal command message looks like this:

  • command=term_message
  • address_1=mainframe_address
  • sender=dwaine_terminal_address
  • data=command that will be sent to the terminal

Example: command=term_message;address_1=02043924;sender=02054d8a;data=echo Hello World! The packet above will send a message from the DWAINE terminal 02054d8a to the mainframe 02043924. The message echo Hello World will be executed and return Hello World!.

Using data=ls would execute the command ls instead.

Player made scripts can also be executed as long as they are in the current directory of the connected DWAINE Terminal. data=myscript 1 2 3 would execute the script called myscript with the arguments provided as if you were the one calling it directly from the console.

Wired Network

Stuff on the station network connected by red power cables. Get a list of these by running term_ping on any TermOS computer that isn't currently connected to something. Not all devices can be connected to via TermOS, though, and some won't reply to pings either. Sneaky!

Important: You can add an argument after running term_ping which will filter out any responses that do not contain the string. This is much easier than searching through every single device that replies to the ping.

Mainframe (PNET_MAINFRAME)

The good ol' mainframe, usually hanging around the Computer Core. Connect to this to access DWAINE. Pretty much every terminal on the station starts out connected to this.

There are a few of these scattered around the universe, though a lot of them are broken and don't actually work.

AI (MAINFRAME_AI)

The AI. Connecting to this will make the AI see "Direct connection from (02001234)". You can chat with the AI by simply sending messages, and it will be able to reply as long as you're connected — your messages show up like PDA messages and the AI can respond in the same way.

Communications Dish (PNET_COM_ARRAY)

The communications dish, primarily used for calling (or recalling) the shuttle, as well as delivering the often completely inaccurate "threat report" at the start of a round.

Commands

  • Call or recall the Emergency Shuttle. Returns status = SHUTL_E_DIS (failed), SHUTL_E_SEN (called), or SHUTL_E_RET (recalled).
    • command: call or recall (call or recall the shuttle; self-explanatory)
    • shuttle_id: emergency (the only usable option)
    • acc_code: The netpass_heads authentication code
    • reason: optional reason for calling the shuttle
  • Transmit something to Centcom or the partner station. Returns status = TRANSMIT_E_SUCCESS or TRANSMIT_E_COOLDOWN.
    • command: transmit
    • transmit_type: centcom for messages to centcom or station for messages to the partner station.
    • acc_code: The netpass_heads authentication code
    • title: transmission title
    • data: message to transmit
    • user: user transmitting message
  • View / download Centcom messages (generally the "threat report" which is always wildly wrong, sometimes other things).
    • Unlike the above commands, these are entered from a terminal connected directly to the array.
    • command: term_message (automatically added if sending from a terminal)
    • data: The text entered into the terminal, e.g. "command=download&message=1".
      • command: One of the following:
        • list: Lists available messages
        • download: Sends a message as a file that you can then file_print (etc)
      • message: If using download, a message number

Example raw packet dump:

(sent) address_1=020036fd; command=call; shuttle_id=emergency; acc_code=(Authentication code); sender=0200c069; 
(recv) command=device_reply; status=SHUTL_E_SEN; address_1=0200c069; sender=020036fd;

Terminals (PNET_ADAPTER)

Other terminals and data terminals on the network, generally. You can direct-connect two TermOS computers together if you want, but there's not much you can really do with that beyond chat back and forth and send files, maybe.

Telepad (PNET_S_TELEPAD)

The Telescience Telepad. There can be more than one of these; you specify which one you want with the -p [0-9] argument to teleman.

You can't change the coordinates with just packets. Coordinates are updated by the computer contacting the mainframe, which sends out the command to the telepad with an attached file.

Example raw packet dump:

[18:47:4]:command=term_message; data=command=teleman&args=-p 1 send; address_1=02002182; sender=02001ed4; 
[18:47:5]:command=term_message; data=command=send&session=746; render; address_1=02001cbd; sender=02002182; 
[18:47:5]:command=term_message; data=command=ack&session=746; address_1=02002182; sender=02001cbd; 
[18:48:1]:command=term_message; data=command=OK; render; address_1=02001ed4; sender=02002182; 
[19:10:1]:command=term_message; data=command=teleman&args=-p 1 receive; address_1=02002182; sender=02001ed4; 
[19:10:1]:command=term_message; data=command=receive&session=17; render; address_1=02001cbd; sender=02002182; 
[19:10:1]:command=term_message; data=command=nack&cause=recharge&session=17; address_1=02002182; sender=02001cbd; 
[19:10:7]:command=term_message; data=command=Telepad is recharging.; render; address_1=02001ed4; sender=02002182; 
[19:13:3]:command=term_message; data=command=teleman&args=-p 1 receive; address_1=02002182; sender=02001ed4; 
[19:13:4]:command=term_message; data=command=receive&session=333; render; address_1=02001cbd; sender=02002182; 
[19:13:4]:command=term_message; data=command=ack&session=333; address_1=02002182; sender=02001cbd; 
[19:14:0]:command=term_message; data=command=OK; render; address_1=02001ed4; sender=02002182;

Printers (PNET_PRINTDEVC)

Printers. Generally you just write to the /mnt/lp-whatever folders on the mainframe.


MechanicNew64.png This page is under construction.
The following information may be incomplete.
Discover if there is a way to directly print to printers

Databanks (PNET_DATA_BANK)

The data banks that contain all of the information on the mainframe.

GuardBuddy docking station (PNET_PR6_CHARG)

GuardBuddy chargers. These also communicate wirelessly to the buddies; see the section there for more.

Raw packets below. You can see the netpass_heads authentication code in here as well (3635 Bravo-51).

[37:25:5]:command=term_message; data=_command=add&_freq=1219; render; address_1=020020f4; sender=02002182; 
[37:25:5]:command=term_message; data=_freq=1219&acc_code=3635 Bravo-501;command=dock_return; render; address_1=020020f4; sender=02002182; 
[37:25:5]:command=term_message; data=command=status&status=success; address_1=02002182; sender=020020f4; 
[40:30:1]:address_1=02002182; data=prman upload 0200143B heckle name=titusgettemy; command=term_message; sender=0200b5ce; 
[49:37:5]:command=term_message; data=command=status&status=ejected&botid=020032dd; address_1=02002182; sender=0200143b;

Some of the commands you can use, as command=#######:

  • status: Gets the status of a buddy docked to this station as a reply:
    • status=nobot: If you get "nobot", there's no buddy here. You'll get only this for every command.
    • status=########: The buddy's network identifier.
    • charge=###: Either nocell (no power cell) or a number from 0 to 100 representing the percent of power remaining in the buddy's cell.
    • tool=#####: The current tool (weapon), or "NONE" if there's no tool installed.
    • deftask=#####: The default task this buddy runs when it has nothing better to do, or "NONE" if it doesn't have one.
    • curtask=#####: The current task this buddy is running, or "NONE" if it doesn't have one.
  • eject: Boots the buddy out of the docking station.
    • No reply here. If you didn't get a nobot reply, it worked.
  • upload: Uploads a new task to the buddy. Optionally with overwrite=? and newmodel=?, which overwrite the current task or default task respectively. Requires a file to be sent along with the data, so good luck spoofing this.
    • You'll get a reply with status=upload_success if the task has been uploaded.
    • You'll get a reply with status=badtask if the task is bad (or missing).
  • download: Downloads a task from the buddy. Use model=1 to download the default task (the exact number doesnt matter), otherwise it'll download the current one.
    • Replies with command=taskfile if it worked. In theory you'll get a file sent to your terminal with the task. What can you do with it?
    • Replies with command=status&status=notask if there's no task to download.
  • taskinq: Gets the buddy's currently installed tasks.
    • Replies with command=trep, with deftask=##### for the default task and curtask=##### for the current task, or "NONE" if there isn't one.
  • wipe: Erases the buddy's installed tasks and replaces them with nothing.
    • Replies with command=status&status=wipe_success.


The chargers also occasionally report back to their host (i.e. the mainframe) when things happen. The format of these may not be 100% correct.

  • command=status&status=ejected&botid=########: Ejected a buddy.
  • command=status&status=connect&botid=########: A buddy docked itself or was docked by someone.

Mainframe Radio (PNET_PR6_RADIO)

The radio near the Mainframe. It's mostly used for talking to the GuardBuddy bots when they're away from chargers, but you can do some other stuff with it.

Capturing packets with the power of the mainframe:

  1. Make a folder for the frequency you want to monitor, e.g. /mnt/radio/1149
  2. Periodically ls /mnt/radio/1149 to see if any packets have appeared
  3. cat /mnt/radio/1149/Q2158018 to view packets

The mainframe will capture any packet sent to a frequency that has a directory created.

Note: The actual mechanics behind this are a bit different (there's some communications going on between the mainframe and radio) but for the most part this will get you what you want.

Regardless, raw packet dump example:

[19:41:7]:command=term_message; data=_command=add&_freq=1149; render; address_1=02002303; sender=02002275; 
[20:03:3]:command=term_message; data=_freq=1149&command=text_message&message=butt&sender_name=fart; render; address_1=02002303; sender=02002275; 
[45:35:6]:address_1=02002275; data=echo test=butt ^ x; command=term_message; sender=02018e2a; 
[45:35:6]:command=term_message; data=command=status&status=success; address_1=02002275; sender=02002303; 
[45:35:6]:command=term_message; data=_freq=1149&test=butt; render; address_1=02002303; sender=02002275;

IR detectors (PNET_IR_DETECT)

IR detectors, usually placed around important things like the Armory and sometimes the AI core.


MechanicNew64.png This page is under construction.
The following information may be incomplete.
Update info on IR detectors

Artlab test apparatus (PNET_TEST_APPT)

The various testing apparatuses in the Artifact Lab. Also includes the "Gas Sensors" you see in places like Toxins.

[34:18:5]:command=term_message; data=command=deactivate; render; address_1=02000d04; sender=02000673;
[34:18:5]:command=term_message; data=OK; render; address_1=0200cbf2; sender=02000673;
[34:18:5]:address_1=02000673; data=gptio deactivate elec_box; command=term_message; sender=0200cbf2;

Terminals (SRV_TERMINAL)

The teleport computer for the Telescience telepad. It doesn't communicate directly with the teleport pad, but instead sends commands to the mainframe. If you want to learn to control the science teleporter remotely, these would be the packets you want to sniff out.

Note that a few other things also use this as a tag.

P: [020639b9]-TYPE: SRV_TERMINAL
P: [02002d0e]-TYPE: PNET_MAINFRAME
[58:26:4]:command=term_message; data=command=teleman&args=-p 2 coords x=50 y=50 z=4; address_1=02002d0e; sender=020639b9; 
[58:26:5]:command=term_message; data=command=ack&session=641; address_1=02002d0e; sender=020639b6; 
[58:26:5]:data=command=set_coords&session=641; address_1=020639b6; command=term_file; sender=02002d0e; 
[58:27:0]:command=term_message; data=command=teleman&args=-p 2 send; address_1=02002d0e; sender=020639b9; 
[58:27:1]:command=term_message; data=command=OK; render; address_1=020639b9; sender=02002d0e; 
[58:27:1]:command=term_message; data=command=send&session=708; render; address_1=020639b6; sender=02002d0e; 
[58:27:1]:command=term_message; data=command=ack&session=708; address_1=02002d0e; sender=020639b6; 
[58:27:7]:command=term_message; data=command=OK; render; address_1=020639b9; sender=02002d0e; 

Nuclear charge (PNET_NUCCHARGE)

The nuclear charge. Authentication is easily spoofed by using the mainframe's built-in nuke manager, nukeman. Just use the same packet you used to spoof superuser access when asked to login with an authorized ID, then repeat with two more login packets with superuser, but with one (or both) of the other fields modified. Either the registered= field or the assignment= field.

Hemera VII's main tape doesn't include this, so you'll have to bring a tape of your own with it, "borrow" one of the replacement Master Tapes on the station or use Hemera VII's other tape, which DOES have nukeman.

If you're feeling like a little bit of DIY, you can also connect to the nuke directly and run commands that way. The following commands can be run without any authorization:

  • status: Returns the nuke status (whether it's counting down or not) and the time left.
  • settime: Sets the detonation time. The maximum time is 600 seconds, the minimum is 120.

These commands require the "auth" field of your packet to be set to the correct netpass_heads:

  • act: Activates the nuclear charge, with an accompanying announcement.
  • deact: Deactivates the nuclear charge, stopping the countdown. Past 10 seconds, you can no longer disarm the nuke- run!

You can also scan the nuclear charge with a Syndicate device analyzer and deploy one elsewhere, if that's more your thing.

Area Power Controllers (PNET_PWR_CNTRL)

The Area Power Controllers attached to the network. They have settings for the equipment, lights, and environmental controls, as well as control of the cover lock. The three power settings can be values from 0 to 3, which represent the following states:

  • 0: Off
  • 1: Auto (Off)
  • 2: On
  • 3: Auto (On)

APCs start off connected to the mainframe, and as such will only respond to packets they believe came from the mainframe. You'll need to override the sender field or disconnect it with a spoofed term_disconnect, the latter allowing you to connect directly with a DWAINE terminal. Some of the packets you can use to interact with them look like this:

sender=02003c12; address_1=02006754; command=term_message; data=command=setmode&light=0&environ=0;
sender=02003c12; address_1=02006754; command=term_message; data=command=status;

You can use the following commands with data=command=####### or simply command=####### if connected by terminal:

  • status: Returns the status of the APC, including all the following fields (but unfortunately not the area name):
    • charge=###: A number from 0 to 100 representing the percent of power remaining in the APC's cell
    • equip=#: A number from 0 to 3 representing the state of the equipment setting for the APC
    • light=#: A number from 0 to 3 representing the state of the light setting for the APC
    • environ=#: A number from 0 to 3 representing the state of the environmental control setting for the APC
    • cover=#: A number representing the state of the cover lock, with 1 for engaged and 0 for disengaged
  • setmode: This command allows you to control the state of the APC, supplying any of the values you wish to change. You can include settings for any of:
    • equip=#
    • light=#
    • environ=#
    • cover=#

Please note that if you turn off equipment power to the computer core APC, you'll have a difficult time executing any more commands.

Wireless Network

Basically everything you can spoof (aside from PDA messages) will require a address_1 field, indicating the target of the message.

sender is added automatically to almost every packet-sending device, though apparently you can get away without one by manually crafting a signal and using a wireless computer's free mode (with greatly reduced range).

Wireless Range

MechanicNew64.png This page is under construction.
The following information may be incomplete.
Confirm that pings still go through Z-levels

.

These are the PDA Ping ranges. You can imagine it as how far you can drop a PDA dropping and have it still respond. Sending may be similar (or unlimited size?).

  • min: 16 tiles
  • med: 32 tiles
  • max: 64 tiles

Note that pings go through Z-levels! If you manage to pin down a signal but there doesn't seem to be anything there, it's probably in the debris field or in one of the adventure zones. Welp!

Broadcast ranges are only for broadcasting — anything can receive a packet if it's in the broadcast range of the source, even if its own broadcast range is far smaller. If your device has a broadcast range of 64 tiles, and your target device has a range of 16 tiles, the target device will receive your signal as long as you're anywhere within 64 tiles, but you won't receive the device's beyond those 16.

PDAs (114.9)

They're PDAs. You know, the ones almost everyone spawns with.

  • Device name: NET_PDA_51XX
  • Broadcast range: ≥ 64 tiles (127 × 127)

Packets:

  • Really easy to scan, the Network Tools cartridge defaults to this frequency.
  • Snoop on people trying to use PDAs to covertly message people! Just be sure to get your ID switched to "NSA Operative" first Clear the log regularly so it doesn't clog up with PDA pings.

Packet spoofing:

  • address_1: Omit both this and group to broadcast to every PDA in range. Otherwise, set to a PDA's address to send only to that PDA.
  • group: An alternative to address_1, sending to all PDAs in the specified group. See the 'Groups' section of your PDA's messenger app for some examples.
  • command: Generally text_message, though there are others, including but not limited to:
    • file_send_req Used to send file send requests, though you can't actually send anything without using the PDA clipboard.
      • file_size The size of the file
      • file_ext The file extension (PPROG, TXT, etc.)
      • file_name The name of the file
    • file_send_acc Used to accept file send requests. Can be spoofed with a ThinkDOS computer on free mode, causing the file to download to the target PDA. Can only accept a valid file send request, and must be sent to the pda that sent the request.
    • file_send Used to send files after send requests are accepted, doesn't work without an accepted file request.
    • report_pda The scan function in the PDA messenger.
    • report_reply Replies to report_pda, can be used to change your PDA's name to other people on the messenger
  • message: The text you want to send. Surprise!
  • sender_name: What the name should show up as. Leaving it blank will make PDAs show it as !UNKNOWN!
  • sender_assignment What the job assignment of the sender should show up as.

Experiment! Maybe you'll find more.

Ruckingenur kits (146.7)

Ruckingenur kits, like the one in the Electronics lab.

  • Device name: NET_RKANALYZER
  • Broadcast range: ≥ 64 tiles (127 × 127)

Ruckingenur kits use packets to maintain a distributed database of blueprints and whether or not they're locked. The seven commands documented below are used by the ruck to maintain this database.


Ruckingenur Protocol
command=SYNCREPLY Sent after SYNC, every kit selects the highest net_id is assigned to be the host
This command only accepts packets addressed to TRANSRKIT
command=SYNC Every ruck responds with SYNCREPLY and considers the sender as a potential host. The current host is an exception, if it detects a new ruck kit it will instead attempt to UPLOAD a Ruckingenur Bundle file containing the database of blueprints.
This command only accepts packets addressed to TRANSRKIT
command=DROP Identical to SYNC except the sender of this packet is not considered as a host. Used when ruckingenur is shutting down.
command=UPLOAD Internal upload channel for blueprint distribution. A bincludes blueprint file. This channel does not generate PDA messages and is used to by rucks to transfer blueprints between themselves.
command=add PDA blueprint upload channel, identical to UPLOAD used by PDA device scanners. For add The host ruckingenur will send a PDA message to the mechanic groups to announce the upload. For legacy reasons the command is "add" not "ADD".
command=DOWNLOAD
data=Item Name
Internal blueprint file request channel, replies with UPLOAD packet with an attached file.
LOCK=1
acc_code=netpass_head
DATA=Item Name
Used to lock and unlock blueprints by name, this packet is normally protected with NT class encryption and cannot be sniffed.
This command only accepts packets addressed to TRANSRKIT

Several of these commands distribute blueprint files, these can be sniffed and copied with mechcomp file components or other means.

When a device scanner is used, blueprints are distributed to other kits with an UPLOAD command. The ruckingenur kit that scanned the blueprints then sends a PDA message announcing the scans.

Wireless network adapters (114.9, variable)

Computers that have a wireless network card. Some of these are included even in devices that aren't really computers, and they don't really do anything, like the "filing cabinet" Security computers.

  • Device name: WNET_ADAPTER
  • Broadcast range: varies

Cogmap1's Morgue filing cabinet, for example:

  • Broadcast range: 18 tiles (35 × 35)

Others may be different. The ranges are dependent on the type of card and its mode.

GuardBuddy devices (121.9)

GuardBuddies and their docking stations.

  • Device name: PNET_PR6_GUARD (buddies), PNET_PR6_CHARG (docking stations)
  • Broadcast range: ≈ 75 tiles (150 × 150)

The following is sent exclusively by the docking stations. They also communicate over the wired network; see their section above for more.

  • command=recharge_src; data=x=##&y=##;: Sent by the docking station as a reply to the recharge broadcast, with its current X and Y (GPS) position, so the buddies know where to go to charge.

There's a lot of network traffic, but here's some examples. If you aren't targeting a specific bot's address, you need to include acc_code=(netpass_heads).

  • address_1=recharge: Sent by the buddies as a broadcast. Causes the docking stations to report their locations; see above.
  • command=dock_return: Adds a task to the buddy to go to a docking station and dock. Makes the buddy say "Software update requested" and show the "update" emotion.
  • command=captain_greet: Makes the buddy say one of several goofy lines, if it's wearing the captain's hat. Sent by the tour guide buddy if it runs into another buddy wearing it.
  • command=wizard_greet: Makes the buddy say of several other goofy lines, if it's wearing a wizard's hat. Sent by the tour guide buddy if it runs into another buddy wearing it.

Doors (141.1)

Pretty much every airlock on, and off, the station.

  • Device name: DOR_AIRLOCK
  • Broadcast range: 6 tiles (11 × 11)

Sending a command to a door requires an access code, a number usually between 1 and 32 (inclusive). This can be found on the maintenance panel by screwdrivering the door. Doors only broadcast signals relatively close by, so you'll have to be nearby if you want to see anything. You can get the address of a door by screwdrivering it open and checking, using the packet sniffer and touching the door, or just taking a guess from doors that respond to your pings.

Some doors can't be screwdrivered so you'll have to use a different option, but those doors also tend to resist packet hacking. AI control is a requirement for doors to receive packets, and most of these doors have it off by default.

Doors broadcast certain details whenever they're interacted with, as well as a few moments later when they auto-close.

  • user_id: Person whose ID was used (e.g. Pubbie Jones). If a mob like Beepsky opens a door, this is ??? (yes, three question marks) instead.
  • If the door opens:
    • data: denied, if someone who didn't have access tried to open a door
  • Otherwise:
    • door_status: State the door is in (e.g. open, closed)
    • lock_status: State of the door bolts (e.g. locked, unlocked)
    • tag: This appears to always be blank.

Sending packets manually to open/close doors:

  • address_1: Network address of door (required)
  • access_code: Access code of the door (required)
  • command: One of the following:
    • open: Opens a door
    • close: Closes a door
    • lock: Drops the door bolts
    • unlock: Raises the door bolts
    • secure_open: Bolts a door open
    • secure_close: Bolts a door closed

Network Radio (141.1, 141.9, also varies)

MechanicNew64.png This page is under construction.
The following information may be incomplete.
Determine broadcast range, find if it possible to receive other files and save them to the disk with file_save [name]

The "Network Radio", which looks like... well, an old timey radio. Usually located near the mainframe in the computer core, sometimes it's elsewhere. This is what interfaces with the mainframe's /mnt/radio.

  • Device name: PNET_PR6_RADIO
  • Broadcast range: ?

You can log into the mainframe by connecting to this using a computer with a wireless network peripheral and FROG or TermOS. You can create a login packet using ThinkDOS's WizWrite and put it on the main drive in ThinkDOS under whatever name you want, then restart with a TermOS disk and run "file_load [name]" in TermOS, which will allow you to run file_send with the login packet.

Secure Lockers (143.1)

Secure lockers that require an ID to open, including personal lockers in the Crew Quarters.

  • Device name: WNET_SECLOCKER
  • Broadcast range: 3 tiles (5 × 5)

The range on these is extremely short.

You can send these a few commands over the radio, though you'll need netpass_security to lock or unlock them and netpass_heads to find netpass_security.

  • address_1=(address): this is required to send packets to a locker and can be found by using a multitool on the locker itself.
  • command=status: Replies with command=lock=[locked]&open=[open]
  • command=lock; pass=(netpass_security): Locks the locker.
  • command=unlock; pass=(netpass_security): Unlocks the locker. Surprise.

If you use one of the lock or unlock packets, you'll get a response with command=ack or command=nack; data=badpass depending on if it worked or not.

Personal lockers don't send messages when opened/claimed with an ID.

Hydroponics trays (143.3)

MechanicNew64.png This page is under construction.
The following information may be incomplete.
Determine if still current.
  • Device name: One of WNET_PACKETSPY, WNET_GENERIC, WNET_DETECTOR, WNET_SYN%%^#FF, randomly
  • Broadcast range: ≥64 tiles (129 × 129)

Packets:

  • netid: 02001234 -- The address of that particular tray. (Isn't this what sender is for?)
  • data: One of the following:
    • event_new: A seed was planted in the tray.
    • event_death: The plant died.
    • event_cleared: The plant (dead or otherwise) was removed from the tray.

Yep, that's it. There's nothing useful here. Not even the type of seed, or if it's ready to harvest, or anything. Sorry.

Fire Alarms (143.7)

  • Device name: WNET_FIREALARM
  • Broadcast range: ∞ (possibly)

Broadcasts a packet when things happen:

  • address_tag: Location name (like Head of Research's Office)
  • type: Alarm type (always Fire)
  • netid: Network address (as well as sender for some reason)
  • alert: What happened:
    • fire: Fire alarm triggered
    • reset: Fire alarm cleared

You can also trigger these remotely if you want to be annoying.

  • address_1: Network address of the Fire Alarm. (Required.)
  • command=#####: One of the following:
    • status: Triggers the above packet broadcast.
    • trigger: Triggers the alarm.
    • reset: Resets the alarm.

Robot patrol beacons (many frequencies)

MechanicNew64.png This page is under construction.
The following information may be incomplete.
Add ways for triggering, receiving, and editing beacon broadcasts, as well as more info on how they work. Find real example of patrol beacon pack

Various patrol beacons around the station. These are used by Guardbuddies, Securitrons, and the tour guide, though often not on the same frequencies.

  • Frequencies: 143.1, 144.1, 144.3, 144.5, and so on.

They don't respond to pings, but they do respond to beacon requests. Beacons have a specific format and options available to control how bots act and what they do.

Securitron and tour guide beacons broadcast on this frequency. They're located under floor tiles, and you can access them by popping them open with a screwdriver and swiping an appropriate card.

Tour Guide beacon, this one from the Escape Arm:

  • Location: tour16
    • tour: 1 -- Marks it as a tour beacon
    • next_tour: tour17 -- Which beacon comes after this in the route
    • desc: In the event of catastrophic station damage... (What the tour guide will say when stopping here)

Patrol beacon, a fictional example:

  • Location: sec
    • patrol: 1 -- Marks it as a patrol beacon
    • next_patrol: bar -- Which beacon comes after this in the route

You can't move the beacons around or create new ones, but you can at least make Murray shout obscenities when describing places. Or make him get stuck into a loop forever. Keep in mind that the text length you're allowed to enter is much shorter than the length of the default tour messages.

Sample log:

[37:15:3]:findbeacon=tour; address_1=!BEACON!; sender=0200564a; 
[37:15:3]:beacon=tour13; netid=02000e46; tour=1; next_tour=tour14; desc=...; 
[37:15:3]:beacon=tour16; netid=02000fa6; tour=1; next_tour=tour14; desc=...; 

Securitrons (144.7)

Securitrons.

Status updates, sent from the bots:

  • type: secbot
  • name: Officer Beepsky -- this is whatever the bot is named. No way to distinguish between identically-named bots
  • loca: Cafeteria -- where the bot is currently located.
  • mode: 0 -- One of various modes (as described by the Securitron control PDA app):
    • 0: Idle (Ready)
    • 1: Spotted someone marked as arrest (Apprehending target)
    • 2: At target, preparing to arrest
    • 3: Arresting target
    • 4: Starting patrol
    • 5: On patrol
    • 6: (Responding to summons) — will go to mode 4 and start patrolling when it reaches its destination

Controlling via the R.O.B.U.S.T. cart's Securitron app:

  • command: One of the following:
    • bot_status: Get the status of the bot
    • go: Start patrolling
    • stop: Stop patrolling
    • summon: Summons the bot
  • active: Officer Beepsky (see note below)
  • target: the floor; only if command=summon. (see note below)

Notes: These are BYOND internal atom references, and not actually text. What's happening is that a BYOND atom reference is being passed in the packet, and printing this reference will yield its name ("(the) floor"). As a result, they're impossible to replicate in packets. These only work from the PDA application for that reason.

MULE bots (144.7)

MULE bots.

Status updates, sent from the bots:

  • type: mulebot
  • name: 1 -- The bot's unique name/ID number.
  • loca: Supply Lobby -- The bot's current location.
  • mode: 0 -- The bot's current mode, from the following:
    • 0: Ready
    • 1: Loading/Unloading
    • 2: Navigating to Delivery Location
    • 3: Navigating to Home
    • 4: Waiting for clear path
    • 5: Calculating navigation path
    • 6: Calculating navigation path
    • 7: Unable to locate destination
  • powr: 100 -- The bot's current cell charge.
  • dest: Medbay -- The bot's current target destination. Refers to an underfloor MULE Delivery Beacon.
  • home: QM #1 -- The bot's home location. Refers to an underfloor MULE Delivery Beacon.
  • load: Jon Pubbie -- Whatever is currently loaded on top of the bot, e.g. player name, Crate, etc.
  • retn: 1 -- Will the bot automatically return home after the delivery?
  • pick: 1 -- Will the bot automatically pick up any cargo at the delivery destination?

Controlling via the QM's PDA:

The # in command_# should be replaced with the name (number) of the bot being controlled (for example, command_1 would control mulebot #1).

  • command_#: Should be one of the following:
    • bot_status: Get the bot's current status (as seen above).
    • target: Set the bot's destination.
    • autoret: Set whether the bot should return after a delivery.
    • autopick: Set whether the bot should pickup crates at the destination.
    • stop: Tell the bot to stop where it is.
    • go: Tell the bot to continue towards its destination.
    • home: Tell the bot to return to its home location.
  • destination: The ID of the bot's new destination (see the MULE bot section of the Quartermaster page for a list of valid destinations). Only used if command_# is set to target.
  • value: Should be 1 or 0, corresponding to Yes or No respectively. Only used if command_# is set to autoret or autopick.

Armory Authorization (146.1)

This is the computer used by Security to authorize the armory.

  • Device name: ARM_AUTH
  • Broadcast range: 3 tiles (5 × 5)

Sending the following packet authorizes the armory: address_1=[arm_auth netid];command=authorize;acc_code=[netpass_heads];

The armory will reply with a packet containing a different acc_code than what you sent it. This new code is netpass_security. This netpass is needed to open lockers via packets.

Beware, only the Head of Security, Authentication Disk (if not already used to authorize the armory) or a packet (shown below) can unauthorize the armory.

You can unauthorize the armory via sending the following packet once armory is authorized. address_1=[armory_auth netid];command=unauthorize;acc_code[netpass_heads];

Remote Signaling Devices (Variable; 141.1 - 148.9)

Remote Signalers are used to transmit and receive simple packets containing a numerical code via a customizable frequency. They will only ever send and receive packets on the frequency they are tuned to.

  • Broadcast range: ∞

When the ACTIVATE button is pressed in a signaler's UI, the following packet is sent over the frequency the signaler is tuned to:

  • message: ACTIVATE
  • code: Whatever the code in the signaler's UI is set to

Signalers will respond to packets formatted in the above structure (the message=ACTIVATE is entirely unnecessary) on their frequency, activating whatever device they may be connected to if the value of code matches the code of the signaler itself.

Signalers do not adjust their behavior if address_1 is present in the packet, and will never include a sender or address_1 key in their packets.

Space GPS (145.3)

Space GPS's allow a user to see their coordinates and the coordinates of other GPS's, as well as tracking other GPS's. GPS's may be wirelessly requested to share their coordinates, which is done with the the use following packet structure:

command: status

address_1: The address of the GPS you wish to see the status of


They will respond with the following packet:

sender: The GPS's address

address_1: The address of the device that sent the status command

identifier: Contains the identifier of the GPS (e.g: 7372-NT13)

coords: Contains the X and Y coordinates of the GPS, in x,y format (e.g coords=111,89)

location: Contains the GPS's Landmark (such as Station or Debris Field). Does NOT contain raw Z level coordinate.

distress: 1 if the Distress Signal is active, 0 otherwise


Example packet: sender=0202dd33; address_1=0202db82; identifier=7372-BRYC; coords=111,89; location=Landmark: Ship; distress=0


GPS also sends similar packet when the distress alert is activated/deactivated, but the distress field is replaced with distress_alert:

distress_alert: help when activated, clear otherwise


Example packet: sender=02049fe0; identifier=5324-test; coords=196,140; location=Landmark: Station; distress_alert=help;


Notably, the GPS identifier is also present in the message a GPS replies to a standard ping with, rather than just its device ID.


Air Vents (141.9)

The common air vent you see on station. Can both siphon and release air.

  • Device name: AVP
  • Broadcast range: ∞

Flashes green when receiving a signal that can cause a change in state. Its light is blue when releasing and red when siphoning.

  • netid=(address): This is required to send packets to an air vent and can be found by using a multitool on the vent itself.
  • tag=(address): A tag that refers to a group of atmospheric devices. Can be used to send packets to an atmospheric device in place of netid. Unlikely to exist on air vents however.
Available Commands
command= parameter= Explanation
power_on No parameters Turns the air vent on.
power_off No parameters Turns the air vent off.
power_toggle No parameters Toggles the air vent.
set_direction (Number) siphoning (parameter<=0.5); releasing (parameter>0.5) Determines whether the air vent will siphon air from the turf or release air into the turf.
set_checks (Bitflag) External bound (1), Internal bound (2), both (3) Sets a check on whether the air vent should not pass the external (the turf's air) pressure bound, internal (the vent's air) pressure bound, or both. When releasing, external bound is the maximum that the turf pressure can be and internal bound is the minimum that our pressure can be until we stop pumping. When siphoning, external bound is the minimum that the turf pressure can be and internal bound is the maximum that our pressure can be until we stop pumping.
purge No parameters Switches to siphoning mode and removes the external bounds check.
end_purge No parameters Switches to siphoning mode and adds the external bounds check.
stabilise No parameters Switches to releasing mode and adds the external bounds check.
set_internal_pressure (Number) pressure bound. Max at 5066.25 Sets the internal pressure bound to a pressure in kilopascals.
set_external_pressure (Number) pressure bound. Max at 5066.25 Sets the external pressure bound to a pressure in kilopascals.
broadcast_status No parameters Sends out a packet containing its current status and other values about itself.
help No parameters Sends out a packet containing a more short version of the commands.


Injectors (141.9)

The injectors you usually see in combustion chambers. Only releases air.

  • Device name: AO
  • Broadcast range: ∞

Flashes the little light cyan when receiving a signal that can cause a change in state.

  • netid=(address): This is required to send packets to an injector and can be found by using a multitool on the injector itself.
  • tag=(address): A tag that refers to a group of atmospheric devices. Can be used to send packets to an atmospheric device in place of netid. Unlikely to exist on injectors however.
Available Commands
command= parameter= Explanation
power_on No parameters Turns the injector on.
power_off No parameters Turns the injector off.
power_toggle No parameters Toggles the injector.
inject No parameters Injects gas into the turf. Flashes the little light also.
set_volume_rate (Number) Liters of gas. Max is 200 liters. Sets how many liters of gas to inject into the turf.
broadcast_status No parameters Sends out a packet containing its current status and other values about itself.
help No parameters Sends out a packet containing a more short version of the commands.


Gas pump (122.5)

Pumps pump air around in pipes. Seems pretty simple.

  • Device name: AGP
  • Broadcast range: ∞

Flashes cyan when receiving a signal that can cause a change in state.

  • netid=(address): This is required to send packets to a pump and can be found by using a multitool on the pump itself.
  • tag=(address): A tag that refers to a group of atmospheric devices. Can be used to send packets to an atmospheric device in place of netid.
Available Commands
command= parameter= Explanation
power_on No parameters Turns the gas pump on.
power_off No parameters Turns the gas pump off.
power_toggle No parameters Toggles the gas pump.
set_output_pressure (Number) release pressure. Max is 15097.425 kPa. Sets the target pressure of the gas pump.
broadcast_status No parameters Sends out a packet containing its current status and other values about itself.
help No parameters Sends out a packet containing a more short version of the commands.


Marionette implants (115.3)

A traitor item that lets you puppet people around in limited ways. See Syndicate Items for more info.

  • Device name: IMP_MARIONETTE
  • Broadcast range: ∞

To activate a marionette implant remotely, you'll need to provide its passkey with passkey=######. This is unique for every implant, and you can find it out by examining the implanter it comes in. Just in case you forget to do that, you'll also get a reminder message in your chatlog whenever you implant someone.

Possible commands are as follows, passed with command=#######:

  • ping: Gets the status of this implant as a reply.
    • status=DANGER: This implant is above the safe heat cap (100). Using it may cause it to burn out.
    • status=ACTIVE: The implant is inside a mob and ready for use.
    • status=IDLE: The implant is not inside of a mob.
    • Unlike every other command, pinging an implant doesn't require its passkey.
  • unlink: If this implant is linked to a remote, removes its connection to that remote.
    • The packet's origin has to be a linked remote for it to work. In other words, you can't craft this packet yourself; it's documented here only for clarity on packet sniffers and the like.
  • say, speak: Forces the implantee to speak a provided phrase aloud. +15 heat.
    • Reads from the data field; data=Hello would force the mob to say "Hello", for instance.
    • Max 45 characters, and it trims asterisks so you can't force them to emote (but you can make them speak over radio). +15 heat.
  • emote: Forces the implantee to emote something. +15 heat.
    • Reads from the data field; data=flip would force the mob to flip, for instance.
    • A number of disruptive emotes, such as *faint, *deathgasp, and *trip, are blacklisted from this function.
  • move, step, or bump: Forces the implantee to move in a cardinal direction. +5 heat.
    • Reads from the data field; you can use the full direction (i.e. NORTH) or just an abbreviation (i.e. N). Not case-sensitive.
    • Unlike other functions, this works on dead mobs as long as they're still fresh. Make of that what you will.
  • shock or zap: Inflicts a moderate chunk of stamina loss and disorient. +50 heat.
    • SMES Human doesn't prevent this, since it functions by stimulating the nervous system and not with an an undirected, external electrical shock.
  • drop or release: Forces the implantee to drop whatever they're holding. +60 heat.
    • The heat cost for this function is inflicted even if it fails to do anything, so you can't spam it constantly.
  • use or activate: Forces the implantee to activate whatever they're holding. +35 heat.
    • Like the drop function, the heat cost for this function is inflicted even if the target isn't holding anything.


After each activation, the implant sends a response signal (command=activate) to the source that triggered it, containing a report about how the activation went:

  • stack=TARG_NULL means that the implant isn't inside of a mob.
  • stack=TARG_DEAD means that implantee is dead!
  • stack=BADPASS means that the provided passkey isn't correct.
  • stack=INVALID can mean a number of things:
    • The provided command doesn't exist. Check your spelling.
    • The data is invalid, such as trying to use a blacklisted emote for emote.
    • The conditions to activate that command weren't met, such as using drop while the target isn't holding any items.
  • If stack isn't present at all in the return packet, the provided command was executed successfully!

If you're absolutely sure that you have the address and passkey right and it hasn't been removed from its mob, but nothing you send is receiving a reply, it likely means that the implant is burned out from overheating. When used with the remote, implants will send pings when they become dangerously hot and when they burn out; using them with packets, however, will not provide any information. You'll only know once it stops responding to your signals. Plan out your heat usage carefully!

Supplementary Video

Department Guides
Engineering Making and Breaking · Construction · Gas · Power Grid · Thermoelectric Generator · Singularity Generator · Geothermal Generator · Catalytic Generator · Nuclear Generator · Mining · Materials and Crafting · Wiring · Hacking · MechComp · Mechanic components and you · Control Unit · Ruckingenur Kit · Reactor Statistics Computer · Cargo Crates
Medsci Doctoring · Genetics · Robotics · Telescience · Plasma Research · Artifact Research · Chemistry · Chemicals · ChemiCompiler · Decomposition
Security Security Officer · Contraband · Forensics · Space Law
Service Foods and Drinks · Botany · Writing · Piano Song Dump · Instruments
The AI Artificial Intelligence · AI Laws · Chain of Command · Guide to AI · Humans and Nonhumans · Killing the AI
Computers Computers · TermOS · ThinkDOS · Packets